Android TextView之Html.fromHtml学习(二)

上一篇文章简单介绍了Html.fromHtml的用法,继续分析其中的实现,该方法的第三个参数TagHandler ,该参数为Html里的一个内部静态接口,该接口里边定义了一个方法public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader);该方法接收四个参数,我们重点看一下最后一个参数
摘要由CSDN通过智能技术生成

上一篇文章简单介绍了Html.fromHtml的用法,继续分析其中的实现,该方法的第三个参数TagHandler ,该参数为Html里的一个内部静态接口,该接口里边定义了一个方法

public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader);

该方法接收四个参数,我们重点看一下最后一个参数XMLReader xmlReader ,是不是很眼熟?在XML解析中我们遇到过。我们再来看一下fromHtml 方法里的实现:

public static Spanned fromHtml(String source, ImageGetter imageGetter,
                                   TagHandler tagHandler) {
        Parser parser = new Parser();
        try {
            parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
        } catch (org.xml.sax.SAXNotRecognizedException e) {
            // Should not happen.
            throw new RuntimeException(e);
        } catch (org.xml.sax.SAXNotSupportedException e) {
            // Should not happen.
            throw new RuntimeException(e);
        }

        HtmlToSpannedConverter converter =
                new HtmlToSpannedConverter(source, imageGetter, tagHandler,
                        parser);
        return converter.convert();
    }

第一行Parser parser = new Parser(); 这里提供一个关于该类的链接,有兴趣的同学可以自己查看源码,源码比较多:org.ccil.cowan.tagsoup.Parser,这里我们重点看一下converter.convert() 这个方法:

mReader.setContentHandler(this);
        try {
            mReader.parse(new InputSource(new StringReader(mSource)));
        } catch (IOException e) {
            // We are reading from a string. There should not be IO problems.
            throw new RuntimeException(e);
        } catch (SAXException e) {
            // TagSoup doesn't throw parse exceptions.
            throw new RuntimeException(e);
        }

这里贴该方法的代码片段,其中mReader 就是在构建HtmlToSpannedConverter 对象的时候传过来的Parser对象。HtmlToSpannedConverter 类实现了ContentHandler 接口,convert 方法的第一行就是mReader.setContentHandler(this); 此时执行mReader.parse(new InputSource(new Strin

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果您使用`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>`标签的文字颜色设置为红色。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值