我正在选择TextView的一部分,然后单击"突出显示"按钮,我将选择的开始和结束索引发送到数据库。然后我从db加载所有开始和结束索引并更改它们之间的文本颜色。
问题是在一次或两次之后,应用程序正在更改未在选择中的文本的颜色..并且所选部分保持不变。
我的代码:
当用户选择并按下突出显示按钮
时int i=contentText.getSelectionStart();
int j=contentText.getSelectionEnd();
db.insertHiglightIndex(String.valueOf(i),String.valueOf(j));
setHighlightedText();
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);
MY SCREENSHOTS。
选择:
结果:
显然,所选区域是从&#34; Garrick&#34; 到&#34; Bart&#34; ,结果来自& #34;实体&#34; 到&#34; 2012&#34;
我无法理解为什么会这样。我认为此<font color='red'>"+a+"</font>
行存在一些问题。
谢谢
答案 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());
}