每次使用Edittext onAfterTextChange方法时,我会检查是否输入了一些特殊字符串(来自functionlist变量),然后更改该字符串的特殊颜色。代码如下
for(String s:functionList)
{
final Pattern p = Pattern.compile(s);
final Matcher matcher = p.matcher(inputStr);
while(matcher.find())
{
//if(matcher.end() - matcher.start()== s.length())
inputStr.setSpan(new ForegroundColorSpan(Color.parseColor(highlightColor)),
matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
我不使用Html.FromHtml方法的原因是;它迫使我使用改变光标位置的setText方法,因为我的edittext也从按钮(按钮调用settext)改变而不仅仅是软键盘,因为按钮更改将光标位置设置为0,所以settext方法会破坏光标位置即使它不是 !!!!因此我不能在软键盘中间添加一些东西(当我尝试添加时, cursorposition总是设置为0 )。这就是为什么我必须使用spannable。
无论如何我的问题是,例如我的一个特殊文本是" log" ..当我输入日志时它工作正常(日志),当附加空格字符的日志(日志日志)它再次正常运行但是当我从第二个日志中删除g时,第一个日志颜色也消失了!!! (log lo)哪个一定不应该会发生。认为粗体日志是彩色的......
为什么会这样?
答案 0 :(得分:1)
如果我理解你正在尝试做什么,你应该尝试类似的事情:
edit.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
Spannable inputStr = (Spannable)s;
for (String function : functionList)
{
for (ForegroundColorSpan old : inputStr.getSpans(start, inputStr.length(), ForegroundColorSpan.class))
inputStr.removeSpan(old);
final Pattern p = Pattern.compile(function);
final Matcher matcher = p.matcher(inputStr);
while (matcher.find())
inputStr.setSpan(new ForegroundColorSpan(Color.BLUE), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) { }
});