这是我目前的代码:
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标记的情况下突出显示多个单词?
答案 0 :(得分:0)
实际使文本在TextView(或EditText)中设置样式的方法是创建Spans,例如ColorSpannable。这就是HTML.fromHtml()为您所做的事情。使用HTML是最简单的方法,但如果您尝试在html文本上执行此操作或重复执行此操作,则快速指出会有问题。如果你手动创建自己的跨度创建,那将是一个痛苦的问题,但是你永远不要使用HTML来避免这些问题。