textview中的Html样式出错了Android

时间:2016-04-27 10:51:36

标签: android android-layout textview android-styles android-text-color

我正在选择TextView的一部分,然后单击"突出显示"按钮,我将选择的开始和结束索引发送到数据库。然后我从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);
    
  3. MY SCREENSHOTS。

    选择:

    结果:

    显然,所选区域是从&#34; Garrick&#34; &#34; Bart&#34; ,结果来自& #34;实体&#34; &#34; 2012&#34;

    我无法理解为什么会这样。我认为此<font color='red'>"+a+"</font>行存在一些问题。

    谢谢

2 个答案:

答案 0 :(得分:2)

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

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

仅在tempString之后工作。这意味着再次添加您font之前的所有tempString标记并设置该文字。

下次再次执行同样的操作,首先删除所有字体标记,然后使用当前使用的相同循环再次将所有字体标记添加回tempString以及当前选择。

答案 1 :(得分:1)

您有错误的索引,因为您正在修改循环中的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()将不会返回初始内容的子字符串。

如果您希望能够将多个子串以红色着色,可以尝试:

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