Html 未在 Android N 中为 "ul"、"li" 调用标签处理程序
Html Tag Handler not called in Android N for "ul", "li"
我们的应用程序中有一个自定义 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()
函数在 ul
、li
中被调用 API-23 及以下但未在 [=25 中调用=]-24 (AndroidN).
从 Html.java
的 source 可以明显看出,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;
}
然后你可以像
那样处理你的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());
}
我发布了一个兼容性库,用于跨 Android 版本标准化和向后移植 Html class,其中包括更多元素和样式回调:
具体来说,给定此调用:
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
imageGetter, tagHandler, spanCallback);
您将有兴趣为未知标签实施 TagHandler,并为自定义 HtmlCompat 从 HTML.
创建的 Spans 实施 SpanCallback
我们的应用程序中有一个自定义 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()
函数在 ul
、li
中被调用 API-23 及以下但未在 [=25 中调用=]-24 (AndroidN).
从 Html.java
的 source 可以明显看出,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;
}
然后你可以像
那样处理你的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());
}
我发布了一个兼容性库,用于跨 Android 版本标准化和向后移植 Html class,其中包括更多元素和样式回调:
具体来说,给定此调用:
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
imageGetter, tagHandler, spanCallback);
您将有兴趣为未知标签实施 TagHandler,并为自定义 HtmlCompat 从 HTML.
创建的 Spans 实施 SpanCallback