在 TextView 中追加 HTML 内容
Append HTML content in a TextView
让我们想象一个用例,我需要在 Android 上创建一个在 TextView 中显示所有内容的记录器。
所以我创建了一个多行的TextView。然后最初有一个向TextView添加简单文本的方法:
TextView output; // Initialized in onCreate
public static void log(final String text) { // Method is called always when Log.log is called
output.append(text + "\n");
}
这很有用,但我想在日志 returns 一些错误信息(例如 HTTP 500)时添加红色文本(或文本背景)。所以我更新了方法并使用了一些 html:
public static void log(final String text) {
String newText = output.getText().toString();
if (text.contains("500")) {
newText += "<font color='#FF0000'><b>" + text + "</b></font><br />";
} else {
newText += text + "<br />";
}
output.setText(Html.fromHtml(newText), TextView.BufferType.SPANNABLE);
}
但它总是只格式化当前的 'text',之前的所有内容 (output.getText()) 都没有格式化。似乎 TextView 没有保留带有 HTML 标签的文本,只是立即进行了装饰。
我试过类似的方法:
spannableString.setSpan(new BackgroundColorSpan(color), 0,
text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
output.setText(spannableString, TextView.BufferType.SPANNABLE);
彩色背景但只是当前文本。我想要像白线一样的输出,然后当大约 500 条显示一些红线时(所以它是动态的)。
有什么想法吗?
好的,经过更深入的搜索,我找到了 SpannableStringBuilder 并更改了代码:
public static void log(final String text) {
// Could be instantiate just once e.g. in onCreate and here just appending
SpannableStringBuilder ssb = new SpannableStringBuilder(output.getText());
if (text.contains("500")) {
ssb.append(coloredText(text + "\n", Color.parseColor("red")));
} else {
ssb.append(text).append("\n");
}
output.setText(ssb, TextView.BufferType.SPANNABLE);
}
private static SpannableString coloredText(String text, int color) {
final SpannableString spannableString = new SpannableString(text);
try {
spannableString.setSpan(new BackgroundColorSpan(color), 0,
text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {}
return spannableString;
}
成功了
让我们想象一个用例,我需要在 Android 上创建一个在 TextView 中显示所有内容的记录器。
所以我创建了一个多行的TextView。然后最初有一个向TextView添加简单文本的方法:
TextView output; // Initialized in onCreate
public static void log(final String text) { // Method is called always when Log.log is called
output.append(text + "\n");
}
这很有用,但我想在日志 returns 一些错误信息(例如 HTTP 500)时添加红色文本(或文本背景)。所以我更新了方法并使用了一些 html:
public static void log(final String text) {
String newText = output.getText().toString();
if (text.contains("500")) {
newText += "<font color='#FF0000'><b>" + text + "</b></font><br />";
} else {
newText += text + "<br />";
}
output.setText(Html.fromHtml(newText), TextView.BufferType.SPANNABLE);
}
但它总是只格式化当前的 'text',之前的所有内容 (output.getText()) 都没有格式化。似乎 TextView 没有保留带有 HTML 标签的文本,只是立即进行了装饰。
我试过类似的方法:
spannableString.setSpan(new BackgroundColorSpan(color), 0,
text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
output.setText(spannableString, TextView.BufferType.SPANNABLE);
彩色背景但只是当前文本。我想要像白线一样的输出,然后当大约 500 条显示一些红线时(所以它是动态的)。
有什么想法吗?
好的,经过更深入的搜索,我找到了 SpannableStringBuilder 并更改了代码:
public static void log(final String text) {
// Could be instantiate just once e.g. in onCreate and here just appending
SpannableStringBuilder ssb = new SpannableStringBuilder(output.getText());
if (text.contains("500")) {
ssb.append(coloredText(text + "\n", Color.parseColor("red")));
} else {
ssb.append(text).append("\n");
}
output.setText(ssb, TextView.BufferType.SPANNABLE);
}
private static SpannableString coloredText(String text, int color) {
final SpannableString spannableString = new SpannableString(text);
try {
spannableString.setSpan(new BackgroundColorSpan(color), 0,
text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {}
return spannableString;
}
成功了