Html textview 中的样式出错 Android

Html Styling in textview goes wrong Android

我正在选择 TextView 的一部分并单击 "highlight" 按钮,我将选择的开始和结束索引发送到数据库。然后我从 db 加载所有开始和结束索引并更改它们之间的文本颜色。

问题是在一两次之后,应用程序正在更改不在选择中的文本的颜色..而选择的部分保持不变。

我的代码:

  1. 当用户选择并按下突出显示按钮时

    int i=contentText.getSelectionStart();
    int j=contentText.getSelectionEnd();
    
    db.insertHiglightIndex(String.valueOf(i),String.valueOf(j));
    setHighlightedText();
    
  2. setHighlightedText() 方法..

    String fullText=contentText.getText().toString();
    for(int i=0; i<db.getAllStartIndex().size();i++){
        String a=fullText.substring(Integer.parseInt(db.getAllStartIndex().get(i)),Integer.parseInt(db.getAllEndIndex().get(i)));
        fullText = fullText.replace(a, "<font color='red'>"+a+"</font>");
    }
    contentText.setText(Html.fromHtml(fullText), TextView.BufferType.SPANNABLE);
    

我的屏幕截图。

选择:

结果:

很明显选择的区域是从"Garrick""Bart",结果是"entity""2012"

我不明白为什么会这样。我认为这条 <font color='red'>"+a+"</font> 行有问题。

谢谢

您的索引有误,因为您正在修改循环中的 fullText 内容。

看看这个例子你就明白了:

final TextView tv = (TextView) findViewById(R.id.textView);
tv.setText( "abcdefghijklmnopqrstuvwxyz0123456789");

String fullText= tv.getText().toString();

// your first iteration
String a = fullText.substring(1,3);
// a contains "ab"
fullText = fullText.replace(a, "<font color='red'>"+a+"</font>");

第一次迭代后全文现在包含

a<font color='red'>bc</font>defghijklmnopqrstuvwxyz0123456789"

那么第二次迭代中的 substring() 将不会 returns 子字符串基于您的初始内容。

如果您希望能够将多个子字符串涂成红色,您可以试试这个:

String fullText = contentText.getText().toString();
StringBuilder result = new StringBuilder();

for(int i=0; i < db.getAllStartIndex().size(); i++){
    fullText = applyFont(result, fullText, Integer.parseInt(db.getAllStartIndex().get(i)), Integer.parseInt(db.getAllEndIndex().get(i)));
}
// Add here the remaining content
result.append(fullText);
contentText.setText(Html.fromHtml(result.toString()), TextView.BufferType.SPANNABLE);


private String applyFont(StringBuilder result, String source, int from, int to){
    result.append(source.substring(0, from));
    result.append("<font color='red'>");
    result.append(source.substring(from, to));
    result.append("</font>");
    return source.substring(to, source.length());
}

索引错误,因为开头已经添加了<font color='red'>,所以第二次这个标签也算作字符串的一部分,所以我建议创建一个新的临时字符串,赋值相同文本到字符串,但在替换了它持有的先前字体标签之后。使用此语法从 originalString

中删除先前的 font 标记
String tempString = originalString.replaceAll("[<](/)?font[^>]*[>]", "");

在那之后只使用 tempString。这意味着再次添加每个先前的 font 标签到 tempString 并设置该文本。

下次再做同样的事情,首先删除所有字体标签,然后再次将它们全部添加回 tempString 以及使用当前使用的相同循环的当前选择。