在Android N中没有为"ul","li"调用Html标记处理程序

okm*_*eep 9 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_HTML_MODE_LEGACY, null, new ListHTMLTagHandler(density));
} else {
  //noinspection deprecation
  result = Html.fromHtml(html, null, new ListHTMLTagHandler(density));
}
Run Code Online (Sandbox Code Playgroud)

handleTag()在我的函数TagHandler被调用ul,li在API-23及以下,但在API-24(安卓N)不叫.

okm*_*eep 12

很明显,从源头Html.java是,TagHandler.handleTag()被称为只有在框架不处理它,本身.

目前,该框架似乎没有很好地处理它. Android N li标签处理

但即使它做得很好,你仍然想要自定义它.对付这种情况的最好办法是更换默认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;
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以处理你的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());
}
Run Code Online (Sandbox Code Playgroud)