Html textview 中的样式出错 Android
Html Styling in textview goes wrong Android
我正在选择 TextView 的一部分并单击 "highlight" 按钮,我将选择的开始和结束索引发送到数据库。然后我从 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);
我的屏幕截图。
选择:
结果:
很明显选择的区域是从"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
以及使用当前使用的相同循环的当前选择。
我正在选择 TextView 的一部分并单击 "highlight" 按钮,我将选择的开始和结束索引发送到数据库。然后我从 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);
我的屏幕截图。
选择:
结果:
很明显选择的区域是从"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
以及使用当前使用的相同循环的当前选择。