Android Edittext可扩展问题

Android Edittext可扩展问题,android,android-edittext,spannable,spanned,Android,Android Edittext,Spannable,Spanned,每次使用AfterTextChange方法编辑文本时,我都会检查是否输入了一些特殊字符串(来自functionlist变量),然后更改该字符串的特殊颜色。代码如下 for(String s:functionList) { final Pattern p = Pattern.compile(s); final Matcher matcher = p.matcher(inputStr); while(matcher.find())

每次使用AfterTextChange方法编辑文本时,我都会检查是否输入了一些特殊字符串(来自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)更改为软键盘,所以setText方法破坏光标位置,因为按钮将光标位置更改为0,即使它不是!!!!因此,我不能用软键盘在中间添加一些东西(当我尝试添加时,CurrPosits总是设置为0)。这就是为什么我必须使用Spanable

无论如何,我的问题是,例如,我的一个特殊文本是“日志”。。当我输入日志时,它工作正常(log),当使用空格字符追加日志(log log)时,它再次工作正常,但是当我从第二个日志中删除g时,第一个日志颜色也消失了(log lo)这是不应该发生的。想象一下粗体原木的颜色


为什么会发生这种情况?

如果我正确理解您的意图,您应该尝试以下方法:

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

似乎您的跨度看起来像(在类似html的语法中):LogLog logWhen i settext cursor position为零,直到用户使用软件键盘输入。他们可以用两种方式输入。Html=setText