Android TextView之Html.fromHtml学习

我们的APP经常会有大量的文字信息要展示,一般就是用TextView来展示各种文字信息。TextView的基本用法比较简单,一般设置是通过textView.setText方法来给TextView来设置文字,咱们最常用的就是

public final void setText (CharSequence text)

这个方法,该方法接收一个CharSequence类型的参数,CharSequence是一个接口,所以只要实现了该接口的类,我们都可以把该类的对象作为参数传进去。可以看看我们常用的String类,String类,String实现了该接口,所以我们平时可以直接把String对象作为参数传到setText()方法里。
一般我们的APP,数据都是从服务器上获取到的Json格式的,通常我们会根据要显示的内容给TextView设置一个Style,这样TextView就可以根据指定的Style来显示文本内容了。但是有些情况下一段文字需要显示不同的颜色或者字体,如果用多个TextView来显示的话,就会非常繁琐和不灵活,所以Android给我们提供了一个Spanned接口(注:该接口继承CharSequence接口),我们可以向setText传入该接口类型的对象,其中SpannedString类就实现了该接口。所以我们想定制TextView的显示样式,可以通过定制SpannedString的对象来实现。Android系统提供了一个Html类,该类位于android.text包下,“This class processes HTML strings into displayable styled text. Not all HTML tags are supported.”这是该类的注释,大体意思就是可以把Html字符串转成可显示的样式,但是不是支持所有标签。其中有一个方法Html.fromHtml(),该方法接收一个String类型的参数,还有一个重载接收三个参数。并且该方法返回一个Spanned对象,所以我们可以通过该方法来生成一个可用于TextView的setText()方法的参数,这样就可以实现对TextView显示格式的定制。

public static Spanned fromHtml(String source)

其中source参数为一个Html字符串,如:

这是一个p标签

。我们可以调用该方法,传入一个Html字符串,然后就可以生成一个Spanned对象,把该对象传入TextView的setText后可以看出显示效果跟网页上显示的差不多

这样就很大程度上提高了TextView的可定制性,可以让一个TextView显示不同格式的文字。但是如果标签里包含img标签,那就没法正常显示图片,但是TextView会显示一个很小的占位图,表示这里是一张图片。
此时就需要用到另外一个重载了

public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)

该方法除了接收一个String的参数外,还接收一个ImageGetter和TagHandler类型的参数,其实通过源码可以看出一个参数的fromHtml内部其实是调用了三个参数的fromHtml方法,只不过是这两个参数都传了null

public static Spanned fromHtml(String source) {
        return fromHtml(source, null, null);
    }

其中ImageGetter是一个接口,“Retrieves images for HTML tags.”这是该接口的注释,大体意思就是检索img标签,里边定义了一个public Drawable getDrawable(String source); 方法,该方法在解析HTML字符串的时候遇到img标签的时候会回调,参数就是图片的URL,返回一个Drawable对象。如果我们想在TextView里能正常显示img标签的图片,那我们就需要实现ImageGetter接口,在里边实现加载图片的功能。以下是一个简单的示例:

static class ImageGetterImpl implements Html.ImageGetter {

        @Override
        public Drawable getDrawable(String source) {
            URL url;
            Drawable drawable = null;
            try {
                url = new URL(source);
                drawable = Drawable.createFromStream(
                        url.openStream(), null);
                drawable.setBounds(0, 0,
                        drawable.getIntrinsicWidth(),
                        drawable.getIntrinsicHeight());
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return drawable;
        }
    }

这里要注意一下,这段示例代码是运行在主线程里的,所以在实际使用的时候,需要放到工作线程里去做,还有就是Drawable记得要设置Bounds,不然就不能正常显示。如果Html标签里有多个img标签的话,该方法会多次回调

显示效果还不错吧!

其中第三个参数TagHandler 将在之后的文档中进一步分析。

你可能感兴趣的:(Android学习笔记)