我们知道android中TextView是可以支持富文本显示的,但是需要进行一定的处理。一般来说,我们会使用:
1.使用Html.fromHtml(html)
2.可以使用HtmlSpanner
Html不需要依赖任何库但是由于自身自带的HTML支持的标签很少,不能满足我们的需求,那我们就会寻找其他解决方案,例如HtmlSpanner。
HtmlSpanner是支持大多数标签的解析库,但是也不是万能,而且已经多年不维护了。下面结合我的项目说说两者存在的缺点:
在我的项目中,其实富文本需求不大,字体样式(粗体斜体下划线),字体大小和字体颜色而已。
一、Html.fromHtml()在使用中,字体和样式和字体颜色都能识别,但是字体大小是没法识别的。查看源码可以知道:
else if (tag.equalsIgnoreCase("font")) {
startFont(mSpannableStringBuilder, attributes);
}
private void startFont(Editable text, Attributes attributes) {
String color = attributes.getValue("", "color");
String face = attributes.getValue("", "face");
if (!TextUtils.isEmpty(color)) {
int c = getHtmlColor(color);
if (c != -1) {
start(text, new Foreground(c | 0xFF000000));
}
}
if (!TextUtils.isEmpty(face)) {
start(text, new Font(face));
}
}
font标签他只处理了color和face,并没有处理size,自然也就不支持字体大小了。但是它支持h系列标签,只不过修改的是整体大小,不符合我们的要求。
运行结果:
可以发现,字体大小没有任何变化。如果使用HtmlSpanner,才能显示出字体大小效果。
二、使用HtmlSpanner
HtmlSpanner比自带的Html支持更多的标签,但是它就是不支持underline,下划线是没有识别的。
同样查看他的源码,
private void registerBuiltInHandlers() {
TagNodeHandler italicHandler = new StyledTextHandler(
new Style().setFontStyle(Style.FontStyle.ITALIC));
registerHandler("i", italicHandler);
registerHandler("em", italicHandler);
registerHandler("cite", italicHandler);
registerHandler("dfn", italicHandler);
TagNodeHandler boldHandler = new StyledTextHandler(
new Style().setFontWeight(Style.FontWeight.BOLD));
registerHandler("b", boldHandler);
registerHandler("strong", boldHandler);
TagNodeHandler marginHandler = new StyledTextHandler(
new Style().setMarginLeft(new StyleValue(2.0f, StyleValue.Unit.EM)));
registerHandler("blockquote", marginHandler);
registerHandler("ul", marginHandler);
registerHandler("ol", marginHandler);
TagNodeHandler monSpaceHandler = wrap(new MonoSpaceHandler());
registerHandler("tt", monSpaceHandler);
registerHandler("code", monSpaceHandler);
registerHandler("style", new StyleNodeHandler() );
//We wrap an alignment-handler to support
//align attributes
StyledTextHandler inlineAlignment = wrap(new StyledTextHandler());
TagNodeHandler brHandler = new NewLineHandler(1, inlineAlignment);
registerHandler("br", brHandler);
Style paragraphStyle = new Style()
.setDisplayStyle(Style.DisplayStyle.BLOCK)