Android Edittext Spannable问题

时间:2014-12-21 18:54:03

标签: android android-edittext spannable spanned

每次使用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)哪个一定不应该会发生。认为粗体日志是彩色的......

为什么会这样?

1 个答案:

答案 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) { }
});