Html.fromHtml Nougat 不调用自定义 HtmlHandler

Html.fromHtml on Nougat doesn't call custom HtmlHandler

我有一个自定义 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 class 永远不会被调用。 (我已经尝试了所有标志)。 在 HtmlHandler 上,我处理标签和样式,例如 background-colorcolor 等等。我已经实现了从 rgbrgbahls 等获取颜色。但是在牛轧糖上它只接受十六进制颜色,因为在牛轧糖上,fromHTML 可以 "read" 颜色并显示它们。为什么会这样?我怎样才能保持颜色的方式?如果您不明白什么,或需要更多详细信息,请告诉我。

我用来测试的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>

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

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

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

其中,fromHtml()at least 2010, if not earlier. fromHtml() in Android 6.0 also handles <div> (see lines 488-489 in the source 以来处理了 <p><strong><u>),我忘记了这种支持是如何进行的。您的 TagHandler 不会为这些标签中的任何一个调用,并且这种行为并不是特别新。

Android 7.0 添加了对 <span> 的支持(请参阅 the 7.1 source 的第 804-805 行),因此需要为 [= 调用 TagHandler 的代码16=] 在 Android 7.0 和以前的版本之间会有不同的表现。

一般来说,支持的标签列表没有记录。 Google 欢迎随时更改支持标签的名单。

您的选择是:

  • 接受它

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

  • 找一些你比较喜欢的HTML-to-Spannable源码