我想实现一种效果,控制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的示例,这个示例可能有一些错误,但它在应用跨度中运行良好。