我有需要在TextView中显示的html文本。 html可能看起来像这样 -
<font color="#AFEEEE"><font style="background-color: rgb(255,140,0);">Text with background and color</font></font>
Html.fromHtml不支持字体标记的颜色以外的任何属性。但我们绝对必须展示背景。我可以编写自定义标记处理程序,但不传入属性,只传入标记。 实现这一目标的最佳方法是什么?
注意:不能使用Webview。
我尝试了下面的代码。如果我在文本上设置raw,它可以工作,但如果我进一步处理它并将其传递给Html.fromHtml,它不会显示背景。
public static final String sText =
"Background on <font style=\"background-color: rgb(255,255,0);\">pa</font>rt text only";
Pattern pattern = Pattern.compile(BACKGROUND_PATTERN);
Matcher matcher = pattern.matcher(sText);
SpannableString raw = new SpannableString(sText);
BackgroundColorSpan[] spans =
raw.getSpans(0, raw.length(), BackgroundColorSpan.class);
for (BackgroundColorSpan span : spans) {
raw.removeSpan(span);
}
while (matcher.find()) {
raw.setSpan(new BackgroundColorSpan(0xFF8B008B),
matcher.start(2), matcher.start(2) + matcher.group(2).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
sText = raw.toString();
final Spanned convertedHtml =
Html.fromHtml(sText, ig, new myTagHandler());
答案 0 :(得分:2)
根据需要添加自己的BackgroundColorSpan
。
以下是一些代码,用于在TextView
内的所有搜索字词上设置此类范围:
private void searchFor(String text) {
TextView prose=(TextView)findViewById(R.id.prose);
Spannable raw=new SpannableString(prose.getText());
BackgroundColorSpan[] spans=raw.getSpans(0,
raw.length(),
BackgroundColorSpan.class);
for (BackgroundColorSpan span : spans) {
raw.removeSpan(span);
}
int index=TextUtils.indexOf(raw, text);
while (index >= 0) {
raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index
+ text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index=TextUtils.indexOf(raw, text, index + text.length());
}
prose.setText(raw);
}
因此,找到您的起点和终点,使用您想要的颜色创建BackgroundSpan
,并使用setSpan()
来应用它。
请注意,这假设只有部分文字需要背景颜色。如果整个TextView
需要颜色,请使用njzk2的建议,然后将颜色应用于整个TextView
。
答案 1 :(得分:2)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
String str = "<span style=\"background-color:#f3f402;\">" + TEXT TO HIGHLIGHT + "</span>";
textView.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY));
} else {
String str = "<font color='#f3f402'>" + TEXT TO HIGHLIGHT + "</font>";
textView.setText(Html.fromHtml(str));
}