【发布时间】:2014-01-04 11:23:25
【问题描述】:
我正在尝试使用Html.fromHtml() 在TextView 中设置背景。特别是,我想在第一个单词上设置背景。
我使用了以下代码:
Html.fromHtml("<font color='red'>("+someText+")</font>");
它正在以文本颜色成功执行。但是我想改变背景颜色。
我该怎么做?
【问题讨论】:
-
本身不再起作用!什么给了??!
我正在尝试使用Html.fromHtml() 在TextView 中设置背景。特别是,我想在第一个单词上设置背景。
我使用了以下代码:
Html.fromHtml("<font color='red'>("+someText+")</font>");
它正在以文本颜色成功执行。但是我想改变背景颜色。
我该怎么做?
【问题讨论】:
试试这个:
TextView TV = (TextView) findViewById(R.id.mytextview01);
Spannable wordtoSpan = new SpannableString("hello hi. how are you?");
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(wordtoSpan);
这是设置文本和背景颜色(后者带有BackgroundColorSpan)。
【讨论】:
对我来说,最好的解决方案是使用 HtmlCompat,它现在已正式集成到 Android X 中 GoogleHtmlCompat。因此,您可以直接从 API 24 使用它,对于早期的 API 版本,您可以通过将 HtmlCompat 库添加到您的 gradle 脚本来使用它。 HtmlCompat 提供了更多标签以及一些内联样式(文本对齐、颜色、背景、背景颜色、文本装饰)。
要在 TextView 中设置字符串的背景颜色,您可以使用以下命令:
String html = "<span style='background-color: #dff0d8;'>"+someText+"</span>"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY));
} else {
textView.setText(HtmlCompat.fromHtml(this.getContext(), html, HtmlCompat.FROM_HTML_MODE_LEGACY));
}
【讨论】:
"yo <span style='background-color: blue;'>dude</span>" 的小实验失败了,但是我的带有大量生成 HTML 的生产代码可以正常工作。去图...
HtmlCompat.fromHtml 进行内部检查
Android 官方不支持通过 HTML 对文本进行背景着色,但我找到了解决方法。
String str = "<span style=\"background-color:#f3f402;\">" + TEXT TO HIGHLIGHT + "</span>";
textView.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY));
但是,上述代码仅适用于 Nougat (API 24) 及更高版本。因此,您必须在不同的 Android 版本中管理 HTML,例如:
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));
}
您可以从这里找到更多关于 Android 支持的 HTML 标签:
【讨论】:
TextView tv=((TextView)findViewById(R.id.textView));
Spannable word=new SpannableString("HELLO SIDDHARTH");
word.setSpan(new BackgroundColorSpan(Color.BLUE), 1, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(word);
【讨论】:
TextView 中工作,但在GridView 中绑定TextView 时不起作用
Html.fromHtml() 不支持背景颜色。您需要自己设置BackgroundColorSpan。
例如,this sample project 使用背景颜色突出显示搜索词。关键方法是:
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);
}
它首先使用getSpans() 和removeSpan() 删除以前的搜索结果,然后创建新的BackgroundColorSpan 实例并通过setSpan() 应用它们。
【讨论】:
Html 类的文档表明它不支持所有标签(我假设还支持属性)。查看 source code(第 653 行)可以看出,它支持的 font 标记的唯一属性是“颜色”和“面部”。
【讨论】:
对不起,
您可以从 XML 布局中做到这一点:
<TextView
android:background="#0000FF"
android:textColor="#FFFFFF" />
或来自代码
TextView tv1=(TextView) findViewById(R.id.tv1);
tv1.setTextColor(Color.RED);
tv1.setBackgroundColor(Color.GREEN);
【讨论】:
你可以试试这个:
LinearLayout linearLayout= (LinearLayout) findViewById(R.id.department_content);
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
TextView tv=new TextView(this);
tv.setLayoutParams(lparams);
String head="<font color=#f5971b>"+this text with color+"</font>";
tv.setText(Html.fromHtml(head));
tv.append("\n"+"thid text in new line");
tv.setTextColor(Color.parseColor("#000000"));
linearLayout.addView(tv);
【讨论】:
我认为一种解决方案是使用库:
https://github.com/Pixplicity/HtmlCompat
如果您生成带有 web 的 html 文本,例如:https://wordhtml.com/
<string name="html_text">
<![CDATA[
<p><span style="color: #0000ff;">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. </span></p>
<p><span style="background-color: #ffff99;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec</span></p>
]]>
</string>
只要这样就可以了:
String htmltext = getString(R.string.html_text).replaceAll(": ",":");
Spanned fromHtml = HtmlCompat.fromHtml(getContext(), htmltext, 0);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
【讨论】: