Android TextView之Html.fromHtml学习(二)

本文详细探讨了Android TextView中Html.fromHtml方法的实现,特别是如何处理HTML标签,尤其是图片(img)标签的解析。通过分析源码,揭示了当不提供自定义标签处理器时,图片无法正确显示的原因。同时,提到了通过实现TagHandler接口来自定义标签解析,以实现更灵活的文本样式定制。
摘要由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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值