【问题标题】:Html.fromHtml() not working with background color of TextHtml.fromHtml() 不适用于文本的背景颜色
【发布时间】:2014-01-04 11:23:25
【问题描述】:

我正在尝试使用Html.fromHtml()TextView 中设置背景。特别是,我想在第一个单词上设置背景。

我使用了以下代码:

Html.fromHtml("<font color='red'>("+someText+")</font>");

它正在以文本颜色成功执行。但是我想改变背景颜色。

我该怎么做?

【问题讨论】:

  • 本身不再起作用!什么给了??!

标签: android textview


【解决方案1】:

试试这个:

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)。

【讨论】:

  • 不,您编辑的代码也不满足@PratikButani 的要求。我已经测试过了。
  • 但他要求更改文本部分的背景颜色。请在我的帖子中查看他的 cmets。
  • @SanketKachhela 你是对的,但是当我在 GridView 的适配器中绑定数据时它不起作用。
【解决方案2】:

对我来说,最好的解决方案是使用 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));
}

【讨论】:

  • 好的,但是如何在一个针对 API 26 的项目中使用官方的 Google Android X HtmlCompat?
  • 只需使用“Html.fromHtml(...);”。 HtmlCompat 的所有功能现在都包含在 Html 中。如果您只针对高于 API 24 的 API,则无需包含其他库 (HtmlCompat)。
  • @Phlip 我无法确认。对我来说,一切仍然正常。你有一个例子吗?在哪个安卓版本上?
  • 它开始工作了。我对"yo &lt;span style='background-color: blue;'&gt;dude&lt;/span&gt;" 的小实验失败了,但是我的带有大量生成 HTML 的生产代码可以正常工作。去图...
  • 这里不需要 if else HtmlCompat.fromHtml 进行内部检查
【解决方案3】:

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 标签:

【讨论】:

    【解决方案4】:
    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 时不起作用
    【解决方案5】:

    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() 应用它们。

    【讨论】:

      【解决方案6】:

      Html 类的文档表明它不支持所有标签(我假设还支持属性)。查看 source code(第 653 行)可以看出,它支持的 font 标记的唯一属性是“颜色”和“面部”。

      【讨论】:

      • 其他答案是这样做的,我只是指出它为什么不起作用,并强调你在使用这个类时需要小心。
      【解决方案7】:

      对不起,

      您可以从 XML 布局中做到这一点:

      <TextView
      android:background="#0000FF"
      android:textColor="#FFFFFF" />
      

      或来自代码

      TextView tv1=(TextView) findViewById(R.id.tv1);
      
      tv1.setTextColor(Color.RED);
      tv1.setBackgroundColor(Color.GREEN);
      

      【讨论】:

      • 我想要背景 ;(
      • 你是对的,谢谢你的编辑.. 但我只想为第一个词做背景。我的意思是在“Hello World”中我只想为“Hello”发声。
      • 好吧,别担心。感谢您的努力。 @SatyakiMukherjee
      • 它只是在 GridView 的适配器中不起作用。我已经尝试使用示例,并且在绑定时可以正常工作但无法正常工作。
      【解决方案8】:

      你可以试试这个:

      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);
      

      【讨论】:

      • 对于普通代码,您总是使用代码 sn-ps。代码片段只能用于 HTML 或 javascript 或其他可以在浏览器中运行的代码。您不能在浏览器中运行 Java。以后使用普通代码块...这次我会为您编辑您的答案并修复格式等,但以后请不要再这样做了。这不是我第一次告诉你这件事......
      【解决方案9】:

      我认为一种解决方案是使用库:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多