我想实现一个控制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的效果范围。
希望有人能给我一些建议。提前谢谢。
答案 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,这个示例可能有一些错误,但它适用于应用跨度。