Android EditText突出显示多个单词

时间:2015-01-09 18:16:47

标签: android android-edittext word highlight

这是我目前的代码:

    public void markWords(String str) {
        str = str.replace("\n", " <br>");
        int spamLength = 20;
        String colorSpam = "#ED9E15";
        String colorBad = "red";
        int i = 0;

        for(String word : str.split(" ")) {
            if(word.length() > spamLength) {
                str = str.replace(word, "<font color='"+colorSpam+"'>"+word+"</font>");
                i++;
            }
        }

        for(String bad : blacklist) {
            if (!bad.startsWith("#") && str.toLowerCase().contains(bad.toLowerCase())) {
                for (String word : str.split(" ")) {
                    if (word.toLowerCase().contains(bad.toLowerCase())) {
                        String rightWord = getRightCased(word, bad);
                        if (word.length() > spamLength) {
                            str = str.replace(rightWord, "</font><font color='"+colorBad+"'>" + rightWord + "</font><font color='"+colorSpam+"'>");
                        } else {
                            str = str.replace(rightWord, "<font color='"+colorBad+"'>" + rightWord + "</font><font color='black'></font>");
                        }
                        i++;
                    }
                }
            }
        }

        text.setText(Html.fromHtml(str), TextView.BufferType.SPANNABLE);
        String gefunden = "Es wurden " + i + " Wörter gefunden.";
        if(i == 1) {
            gefunden = "Es wurde " + i + " Wort gefunden.";
        }
            Toast msg = Toast.makeText(getApplicationContext(), gefunden, Toast.LENGTH_SHORT);
            msg.show();
    }

    public String getRightCased(String str, String bad) {
        String string = str;

        for(int i = 1; i < str.length(); i++) {
            if(!string.toLowerCase().startsWith(bad.toLowerCase())) {
                string = string.substring(1);
            }
        }
        for(int i = 1; i < str.length(); i++) {
            if(!string.toLowerCase().endsWith(bad.toLowerCase())) {
                string = string.substring(0, string.length() - 1);
            }
        }
        return string;
    }

它第一次工作,但是当文本包含html标记或者文本中添加了一些空格然后再次突出显示单词时崩溃...如何在不使用html标记的情况下突出显示多个单词?

1 个答案:

答案 0 :(得分:0)

实际使文本在TextView(或EditText)中设置样式的方法是创建Spans,例如ColorSpannable。这就是HTML.fromHtml()为您所做的事情。使用HTML是最简单的方法,但如果您尝试在html文本上执行此操作或重复执行此操作,则快速指出会有问题。如果你手动创建自己的跨度创建,那将是一个痛苦的问题,但是你永远不要使用HTML来避免这些问题。