4
Button btnBold = (Button) findViewById(R.id.btnBold);
    btnBold.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();


        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.BOLD), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});


Button btnNormal = (Button) findViewById(R.id.btnNormal);
    btnNormal.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();
        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});

使用上面的代码,我试图从按钮中选择 BOLD 和 UNBOLD 文本。

例如: 我通过一次选择全部使这一行变为粗体。

现在,如果我通过选择上面一行中的一些文本来应用粗体,那么它将不起作用。

我已经完成了这些答案,但没有运气:

如何在 Edittext Android 中取消选中文本?

删除跨度上的样式

从edittext中的选定文本中删除样式

上述解决方案的问题在于,例如,如果您从文本中选择了五个单词并将它们设为粗体,而现在您选择了该粗体文本的一部分并取消了粗体,那么所有五个单词都将变为非粗体。

上述链接中提到的解决方案使用以下代码删除跨度,这不能正确解决问题

Spannable str = this.getText();
StyleSpan[] spans = str.getSpans(sStart, sEnd, StyleSpan.class);
for (int i = 0; i < spans.length; i++) {
    if (spans[i].getStyle() == android.graphics.Typeface.BOLD){
        str.removeSpan(spans[i]);
    }
}

我找不到可以从选定范围中删除跨度的 Android API。任何帮助表示赞赏,谢谢。

4

0 回答 0