安卓span如何在EditText中对输入字符进行操作



我想实现一种效果,控制edittext中的输入字符是否使用span。

例如,在EditText中可以使用

getEditableText().setSpan(new StyleSpan(Typeface.NORMAL), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

使所选字符为粗体。是否有解决方案,当用户启用粗体设置时,此后输入的每个字符都将为粗体,而一旦用户禁用粗体设置,之后输入的字符将不会为粗体。

我尝试使用Spann.EXCLUSIVE_INCLUSIVE作为SpannableStringBuilder.setSpan()中的标志,但我只能控制SPAN的效果何时开始,而不能控制结束。

还尝试使用TextWatcher来监听每个字符的输入,并将Span设置为每个字符。

 @Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
{
    setTextSpan(start, lengthBefore, lengthAfter);
}
private void setTextSpan(int start, int lengthBefore, int lengthAfter)
{
    if (isBold) {
        getEditableText().setSpan(new StyleSpan(Typeface.BOLD), start, start + lengthAfter, Spanned
                .SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

但是当使用Html.toHtml()时,每个字符都被<b></b>包装。

类似<p dir="ltr"><b>1</b><b>1</b><b>1</b><b>1</b><b>1</b><b>1</b></p>

我在SpannableStringBuilder.java中阅读了一些源代码,但没有找到任何方法来更改span的影响范围。

希望有人能给我一些建议。提前谢谢。

已经找到了一些有用的建议,您可以查看"Android EditText:如何在撰写时应用跨度?"。

但是,还有另一个问题:标志"SPAN_INCLUSIVE_INCLUSIVE"设置字体BOLD效果良好。但是,当我切换到设置字体NOT BOLD(只是恢复正常)时,插入的文本仍然是粗体。我不知道如何解决这个问题。

首先,为EditText设置TextWatcher。然后有两种解决方案
1.当文本发生更改时,如果输入字符,请使用removeSpan(),然后使用setSpan()重置范围
2.使用反射。SpannableStringBuilder有成员调用mSpanEnds,该数组在SpannableStringBuilder中记录所有跨度的位置信息,用以反映其值的变化
我有一个解决方案2的示例,这个示例可能有一些错误,但它在应用跨度中运行良好。

相关内容

  • 没有找到相关文章

最新更新