在TextView中附加HTML内容

时间:2017-02-07 17:32:33

标签: java android html textview 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");
}

这就像一个魅力,但我想在日志返回一些不良信息(例如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时显示一些红线(所以它是动态的)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,所以经过一些更深入的搜索后,我发现了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;
}

这就是诀窍