Android - Html.fromHtml处理背景颜色

时间:2014-05-14 22:47:10

标签: android html textview

我有需要在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());

2 个答案:

答案 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));
}

更多 - https://stackoverflow.com/a/46035856/3625510