【问题标题】:Html Tag Handler not called in Android N for "ul", "li"未在 Android N 中为“ul”、“li”调用 Html 标记处理程序
【发布时间】:2016-12-20 12:26:03
【问题描述】:

我们的应用程序中有一个自定义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));
}

TagHandler 中的 handleTag() 函数在 API-23 及更低版本中为 ulli 调用,但在 API-24 (Android N) 中不调用。

【问题讨论】:

  • @CommonsWare 抱歉。已编辑。
  • "...但在 API-24 中没有调用..."您是否在 Android N 设备上运行过它?
  • Android 错误跟踪器上有一个错误。请给它加注星标以引起注意。 b.android.com/214637
  • @HiI'mFrogatto 是的。模拟器和带有 Android-N 的 Nexus 5X

标签: android spannablestring android-7.0-nougat


【解决方案1】:

Html.javasource 可以明显看出,TagHandler.handleTag() 仅在框架本身不处理它时才被调用。

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

但即使它做得很好,你还是想定制它。处理这个问题的最好方法是用您自己的标签替换默认的ulli 标签。由于框架不会处理您的自定义标签,因此将要求您的 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;
}

然后你可以像处理你的html字符串

html = customizeListTags(html);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY, null, new CustomTagHandler());
} else {
  //noinspection deprecation
  result = Html.fromHtml(html, null, new CustomTagHandler());
}

【讨论】:

  • 这也不是没有问题。例如,如果您的输入字符串是类似
      ...
      ...
    之类的替换标记版本,则标记处理程序将按以下顺序获取它们:打开 ol,打开 ul , 关闭 ul, 关闭 ol。
  • @bran.strat 为什么订单会改变?
  • 能否添加您的CustomTagHandler 班级代码
  • @AkashRaghav 你需要实现 Html.TagHandler Interface 。如果您正在寻找示例,I found one here
  • @VivekBarai 它可以是任何不是 HTML 标准标签的字符串。例如“自定义UL”。不能是 HTML 中的标准标签“ul”、“ol”、“b”等。
【解决方案2】:

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

https://github.com/Pixplicity/HtmlCompat

具体来说,鉴于此调用:

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

您将有兴趣为未知标签实现 TagHandler,并为自定义 HtmlCompat 从 HTML 创建的 Span 实现 SpanCallback。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多