android span如何对EditText中的输入字符起作用

时间:2016-05-10 03:33:22

标签: android html spannablestring richedit spannable

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

例如,在EditText中可以使用

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

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

我尝试使用 Spanned.SPAN_EXCLUSIVE_INCLUSIVE 作为 SpannableStringBuilder.setSpan()中的标记,但我可以控制span' s效果开始,并且无法控制结束。

还尝试使用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的效果范围。

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

2 个答案:

答案 0 :(得分:0)

已找到一些有用的建议,您可以查看“Android EditText: how to apply spans when composing?”。

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

答案 1 :(得分:0)

首先,为EditText设置TextWatcher。然后有两种解决方案 1.当文字改变时,如果是输入字符,请使用removeSpan(),然后使用setSpan()重设范围的范围。
2.使用反射。 SpannableStringBuilder有成员电话mSpanEnds,这个数组记录了SpannableStringBuilder中所有范围的位置信息,使用反映更改了它的价值。
我有一个sample解决方案2,这个示例可能有一些错误,但它适用于应用跨度。