2

我有一个自定义TextView, 来显示 html 文本。对于牛轧糖之前的设备,它可以工作。正如您在 Nougat 上已经知道的那样,不推荐使用 fromHtml,它需要一个标志..所以我的代码是这样的

 Spannable s = getRichText(text);
 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
     super.setText(Html.fromHtml(s.toString(), Html.FROM_HTML_MODE_COMPACT, this, new HtmlHandler(getContext())), BufferType.SPANNABLE);
 } else {
     super.setText(Html.fromHtml(s.toString(), this, new HtmlHandler(getContext())), BufferType.SPANNABLE);
 }

问题在于,HtmlHandler该类永远不会被调用。(我已经尝试了所有的标志)。我HtmlHandler处理标签和样式,例如background-colorcolor等等。我已经实现了从rgb,rgba等获取颜色hls。但是在 Nougat 上它只接受带有十六进制的颜色,因为在 Nougat 上,fromHTML可以“读取”颜色并显示它们。为什么会这样?我怎样才能保持我的颜色?如果您有不明白的地方,或者需要更多详细信息,请告诉我。

我用于测试的 html 是

<p><strong>Server</strong><u> message</u><strong><u>!!!</strong></u> <span style="background-color: rgb(255,0,0);">Not working on Nugat</span></p>
4

1 回答 1

5

Html.fromHtml()只会调用您无法识别TagHandler的 HTML 标签。fromHtml()在您的示例 HTML 中,您有:

  • <p>
  • <strong>
  • <u>
  • <span>

在您的第一条评论中,您还提到了div.

其中,至少从2010 年(如果不是更早)fromHtml()开始处理<p><strong>和。在 Android 6.0 中也可以处理(参见源代码中的第 488-489 行),我忘记了该支持是如何返回的。您不会被要求使用这些标签中的任何一个,而且这种行为并不是特别新。<u>fromHtml()<div>TagHandler

Android 7.0 添加了对(参见7.1 源<span>代码中的第 804-805 行)的支持,因此期望调用a 的代码在 Android 7.0 和以前的版本之间的行为会有所不同。TagHandler<span>

通常,支持的标签列表是未记录的。欢迎 Google 随时更改受支持标签的名单。

您的选择是:

  • 和它一起生活

  • 获取您喜欢的源代码,将Html.java其重构到您自己的包中,然后使用该副本,根据您的需要进行修改

  • Spannable找到一些您更喜欢的其他 HTML 到源代码

于 2016-10-23T21:10:56.090 回答