Android使用Html.fromHtml显示富文本之标签拓展-打造没有不支持的标签

本文介绍如何在Android中处理富文本显示,详细讲解了Html.fromHtml的限制和HtmlSpanner的不足,以及如何通过修改Html源码来支持字体大小和下划线。通过自定义TagHandler和修复源码错误,成功实现了自定义富文本标签的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道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)
                .setMarginBottom(
                 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值