Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android span如何处理EditText中的输入字符_Android_Html_Spannablestring_Richedit_Spannable - Fatal编程技术网

android span如何处理EditText中的输入字符

android span如何处理EditText中的输入字符,android,html,spannablestring,richedit,spannable,Android,Html,Spannablestring,Richedit,Spannable,我想实现一种效果,控制edittext中的输入字符是否使用span 例如,在EditText中可以使用 getEditableText().setSpan(new StyleSpan(Typeface.NORMAL), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 将所选字符设置为粗体。是否有解决方案,当用户启用粗体设置时,此后输入的每个字符都将粗体,并且一旦用户禁用粗体设置,之后输入的字符将不会粗体 我尝试在SpannableStringBuilder.s

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

例如,在EditText中可以使用

getEditableText().setSpan(new StyleSpan(Typeface.NORMAL), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
将所选字符设置为粗体。是否有解决方案,当用户启用粗体设置时,此后输入的每个字符都将粗体,并且一旦用户禁用粗体设置,之后输入的字符将不会粗体

我尝试在SpannableStringBuilder.setSpan()中使用SPAN.SPAN_EXCLUSIVE_INCLUSIVE作为标志,但我只能控制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()时,每个字符都将被
包装

比如111111

我在SpannableStringBuilder.java中阅读了一些源代码,但没有找到任何方法来更改span的作用域


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

找到了一些有用的建议,您可以查看“”


但是,还有另一个问题:标志“SPAN_INCLUSIVE_INCLUSIVE”设置字体粗体效果很好。但是,当我切换到将字体设置为不加粗(只是返回到正常值)时,插入的文本仍然是加粗的。我不知道如何解决这个问题。

首先,为EditText设置
TextWatcher
。然后有两种解决方案。
1.文本更改时,如果输入字符,请使用
removeSpan()
,然后使用
setSpan()
重置量程。
2.使用反射
SpannableStringBuilder
具有成员调用
mSpanEnds
,此数组在
SpannableStringBuilder
中记录所有span的位置信息,使用reflect更改其值。

我有一个解决方案2,这个示例可能有一些错误,但它在应用范围内工作得很好。

你使用的TextWatcher怎么样,有什么问题吗?@Hoo Chhunleng很抱歉这么晚才回复。问题是,当我使用TextWatcher并输入一些字符时,显示是正确的,但经过Html.toHtml()转换后,结果不是我想要的。例如,输入:abdce,转换后我会得到“

abcde

”,但我想要的结果是“

abcde

”@hoo Chhunleng,这样就可以将所选文本设置为粗体。我想要的效果是,当启用粗体时,后面输入的所有字符都是粗体,禁用粗体,输入正常。抱歉打扰您,您解决问题了吗?还是找到其他方法来实现?如果是这样的话,非常感谢你的回复。嗨,我已经阅读了你提到的答案,这个解决方案可以解决一些问题,但是我遇到的情况更复杂。我终于想到了两个解决方案。我将在我的回答中描述它们