2016-08-13 51 views
7

HTML标记处理程序我们已经在我们的应用程序的项目符号列表定制TagHandler不叫Android的N代表“UL”,“礼”

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)); 
} 

TagHandlerhandleTag()函数被调用的ulli API-23及以下版本,但未在API-24(Android N)中调用。

+1

请提供[mcve]。 – CommonsWare

+0

@CommonsWare抱歉。编辑。 – okmanideep

+0

_“...但未在API-24中调用......”_您是否在Android N设备上运行过它? –

回答

8

sourceHtml.java可以明显看出,只有在框架本身不处理它时才调用TagHandler.handleTag()

目前,该框架似乎没有很好地处理它。 Android N li tag handling

但即使它做得很好,您仍然想要自定义它。处理这个问题的最佳方法是用您自己的标签替换默认的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()); 
} 
+0

这不是没有它的问题。例如,如果您的输入字符串是您替换的标签版本,如

    ...
    ...
标签处理程序将按以下顺序获取它们:open ol,open ul,close ul,close ol。 –

+1

@ bran.strat为什么订单会改变? – okmanideep

+0

可以请你添加你的'CustomTagHandler'类代码 –

-1

我已经发布了兼容库进行规范和反向移植在Android版本,其中包括元素和造型更回调的HTML类:

https://github.com/Pixplicity/HtmlCompat

具体来说,鉴于此调用:

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

你会感兴趣的实施TagHandler未知的标签,并SpanCallback定制的跨度是从HtmlCompat HTML创建。