安卓EditText如何在文本中同时高亮多个单词

3

我在EditText中搜索了一些单词,经过一些逻辑处理,得到了这些单词的索引。这些索引被存储在一个ArrayList中。

然后我使用了这个函数来突出显示这些单词的颜色。

    public void changeColor(EditText et, ArrayList<ArrayList<Integer>> arr) {
    Spannable wordtoSpan = new SpannableString(et.getText());
    if (arr==null) return;
    for (int i=0; i<arr.size(); i++){
        wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), arr.get(i).get(0),
                arr.get(i).get(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        et.setText(wordtoSpan, TextView.BufferType.SPANNABLE);
        System.out.println("i'm changing color now");
    }
}

然而,尽管循环执行的次数与单词数量相同,只有第一个单词被高亮显示。 我尝试用TextView替换EditText,但仍只有一个单词被高亮显示。 有人可以帮忙看看这里出了什么问题吗?谢谢。

3个回答

1

我不确定,但可能是由于编辑文本和文本视图与for或while循环的行为导致的。你无法使用for循环实现这样的行为。我曾尝试为卡拉OK应用程序做同样的事情,最终使用了runnable和handler才能实现。尝试使用以下代码。

   `String text = yourEditText.getText().toString();
    final String[] wordArray = text.split(" ");
    final Handler handler = new Handler();
    final String[] selString = new String[1];
    Runnable runnable = new Runnable() {
        int i=0;
        @Override
        public void run() {
            selString[0] = wordArray[i];
            i++;
            String str =  et.getText().toString().replaceAll(selString[0], "<font color='red'>"+ selString[0] +"</font>");
            ((EditText)et).setText(Html.fromHtml(str), TextView.BufferType.SPANNABLE);
            if(i<wordArray.length)
                handler.postDelayed(this,500);
        }
    };
    handler.post(runnable);`

该代码获取用户在编辑文本中输入的文本,使用空格进行分割,并以500毫秒的时间间隔逐个突出显示单词。

1
这是我正在使用的。
 public void setHighLightedText(EditText editText, String textToHighlight) {
    String tvt = editText.getText().toString();
    int ofe = tvt.indexOf(textToHighlight, 0);
    Spannable WordtoSpan = new SpannableString(editText.getText());

    for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {


        ofe = tvt.indexOf(textToHighlight, ofs);
        if (ofe == -1)
            break;
        else {
            WordtoSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            editText.setText(WordtoSpan, TextView.BufferType.SPANNABLE);
        }
    }
}

1

看起来是正确的,但最好用以下代码替换

public void changeColor(EditText et, ArrayList<ArrayList<Integer>> arr) {
    Spannable wordtoSpan = new SpannableString(et.getText());
    if (arr==null) return;
    for (int i=0; i<arr.size(); i++){
        wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), arr.get(i).get(0),
            arr.get(i).get(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        System.out.println("i'm changing color now");
    }
    et.setText(wordtoSpan);
}

如果在这些更改之后,您的问题仍然存在,我认为它可能与“arr”中的字符串索引有关。

我尝试了你的方法。然而,高亮仍然只发生在一个单词上。我使用了这个println进行测试,可以看到有许多索引。我唯一怀疑的是我把这个函数放在了onCreate之外。你有其他可以实现相同目的的例子吗?谢谢。 - sunraincyq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接