Android N中未为“调用Html标记处理程序”;保险商实验室&引用;李",;

Android N中未为“调用Html标记处理程序”;保险商实验室&引用;李",;,android,spannablestring,android-7.0-nougat,Android,Spannablestring,Android 7.0 Nougat,我们的应用程序中有一个自定义的TagHandler,用于项目符号列表等 html = "<ul><li>First item</li><li>Second item</li></ul>"; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { result = Html.fromHtml(html,Html.FROM_

我们的应用程序中有一个自定义的
TagHandler
,用于项目符号列表等

html = "<ul><li>First item</li><li>Second item</li></ul>";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY, null, new ListHTMLTagHandler(density));
} else {
  //noinspection deprecation
  result = Html.fromHtml(html, null, new ListHTMLTagHandler(density));
}
html=“
  • 第一项
  • 第二项
”; if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.N){ 结果=Html.fromHtml(Html,Html.FROM_Html_MODE_LEGACY,null,new ListHTMLTagHandler(density)); }否则{ //无检查弃用 result=Html.fromHtml(Html,null,新列表htmltaghandler(density)); }
my
TagHandler
中的
handleTag()
函数在API-23及以下版本中为
ul
调用,
li
,但在API-24(Android N)中未调用。

Html.java
的定义中可以看出,
TagHandler.handleTag()
只有在框架本身不处理它时才被调用

目前,该框架似乎没有很好地处理它。

但是,即使它做得很好,你也会想要定制它。处理此问题的最佳方法是将默认的
ul
li
标记替换为您自己的标记。由于框架不会处理您的自定义标记,因此将要求您的
TagHandler
处理它

public static String customizeListTags(@Nullable String html) {
  if (html == null) {
    return null;
  }
  html = html.replace("<ul", "<" + UL);
  html = html.replace("</ul>", "</" + UL + ">");
  html = html.replace("<ol", "<" + OL);
  html = html.replace("</ol>", "</" + OL + ">");
  html = html.replace("<dd", "<" + DD);
  html = html.replace("</dd>", "</" + DD + ">");
  html = html.replace("<li", "<" + LI);
  html = html.replace("</li>", "</" + LI + ">");
  return html;
}

我已经发布了一个兼容性库,用于跨Android版本标准化和向后移植Html类,其中包括更多元素和样式的回调:

具体而言,鉴于这种调用:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
        imageGetter, tagHandler, spanCallback);

您将感兴趣的是为未知标记实现TagHandler,以及为自定义HtmlCompat从HTML创建的跨距而实现SpanCallback。

请提供一个。@Commonware抱歉。已编辑。“…但未在API-24中调用…”您在安卓N设备上运行了它吗?安卓错误追踪器上有一个错误。请用星号表示注意@你好,我是罗加托,是的。Emulator和Nexus 5X与Android的结合也存在问题。例如,如果您的输入字符串是这样的东西的替换标记版本…
标记处理程序将按以下顺序获取它们:open ol,open ul,close ul,close ol.@bran.strat为什么顺序会更改?您可以添加
CustomTagHandler
类吗code@AkashRaghav你需要实施。如果您正在寻找一个示例,@VivekBarai它可以是HTML中非标准标记的任何字符串。例如“CustomUL”。它不能是“ul”、“ol”或“b”等,它们是HTML中的标准标记。
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
        imageGetter, tagHandler, spanCallback);