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

我们知道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)
  
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
如果您使用`Html.fromHtml()`方法设置富文本时,样式没有生效,那么您需要检查以下几个方面: 1. 首先,确保您的富文本字符串中包含的样式属性是支持的。例如,`<font>`标签支持以下属性:`color`、`face`、`size`。 2. 确保您的文本视图中已启用样式属性。在 XML 中,您可以使用`android:textAppearance`属性或`android:textStyle`属性来设置样式。如果您在 Java 代码中创建 TextView,您也可以使用`setTextAppearance()`或`setTypeface()`方法来设置样式。 3. 如果您的文本视图中已启用样式属性,但样式仍未生效,则可能是由于您的设备版本过低所致。在 Android 7.0 及更高版本中,您可以使用`Html.fromHtml()`方法设置富文本,并且样式属性会生效。但在较早的 Android 版本中,您需要使用`Html.fromHtml()`方法的第二个参数来指定一个`Html.TagHandler`对象,以便将样式属性应用于文本视图中。下面是一个示例: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { textView.setText(Html.fromHtml(htmlString, Html.FROM_HTML_MODE_COMPACT)); } else { textView.setText(Html.fromHtml(htmlString, null, new MyTagHandler())); } private class MyTagHandler implements Html.TagHandler { @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if (tag.equalsIgnoreCase("font") && !opening) { output.setSpan(new ForegroundColorSpan(Color.RED), output.length() - 1, output.length(), 0); } } } ``` 在上面的代码中,`MyTagHandler`类实现了`Html.TagHandler`接口,并重写了`handleTag()`方法来处理`<font>`标签。在这个示例中,它将文本视图中的所有`<font>`标签的文字颜色设置为红色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值