在项目中遇到了需要使用TextView展示html文本信息的需求,于是根据网上介绍和官网文档进行了一些探究,这里简单记录下Html.fromHtml()的一些基本功能。


在Android中Html类提供我们一些方法可以将HTML字符串转变成可显示的样式文本。但并不是所有的HTML标签都支持。

    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = ((TextView) findViewById(R.id.text));
        String content = "我叫<font color=\"#FF0000\">张小龙</font>";
        if (Build.VERSION.SDK_INT >= 24)
            text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT));
        else
            text.setText(Html.fromHtml(content));
    }

当然我们也可以引用xml中资源,但是我们要通过<![CDATA[]]>进行转义:

<resources>
    <string name="content"><![CDATA[我叫<font color="#FF0000">张小龙</font></string>
</resources>

通常情况下我们会遇到文字加图片的形式,Html类中提供了 Html.ImageGetter接口,我们可以利用此方法实现图片的加载,下面分三种情况进行图片的加载:

本地图片

String content = "我叫<font color=\"#FF0000\">张小龙</font><br><img src=\"/mnt/sdcard/temp/xiaolong.jpg\" />";
text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
Html.ImageGetter imageGetter = new Html.ImageGetter() {

    public Drawable getDrawable(String source) {
    Drawable drawable=null;
    drawable=Drawable.createFromPath(source);
  drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    return drawable;  
    };
}

项目资源图片

String content = "我叫<font color=\"#FF0000\">张小龙</font><br><img src=\""+R.mipmap.xiaolong+"\" />";
text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
Html.ImageGetter imageGetter = new Html.ImageGetter() {

    public Drawable getDrawable(String source) {
    Drawable drawable=null;
    int rId=Integer.parseInt(source);
    drawable=getResources().getDrawable(rId);
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    return drawable  
    };
}

网络图片

public class MainActivity extends AppCompatActivity {

    private TextView text;
    //多个图片展示使用Map<String,Drawable> drawableMap = new HashMap<>()进行存储
    private Drawable drawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = ((TextView) findViewById(R.id.text));
        if (Build.VERSION.SDK_INT >= 24)
            text.setText(Html.fromHtml(getString(R.string.content),Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
        else
            text.setText(Html.fromHtml(getString(R.string.content),imageGetter,null));
    }
    Html.ImageGetter imageGetter = new Html.ImageGetter() {
        @Override
        public Drawable getDrawable(String s) {
        //多张图片情况根据drawableMap.get(s)获取drawable
            if (drawable != null)
                return drawable;
            else
                initDrawable(s);
            return null;
        }
    };

    /**
     * 加载网络图片
     * @param s
     */
    private void initDrawable(final String s) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    final Drawable drawable = Glide.with(MainActivity.this).load(s).submit().get();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (drawable != null) {
                                drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                                //多张图片情况下进行存储:drawableMap.put(s,drawable);
                                MainActivity.this.drawable = drawable;
                                if (Build.VERSION.SDK_INT >= 24)
                                    text.setText(Html.fromHtml(getString(R.string.content),Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
                                else
                                    text.setText(Html.fromHtml(getString(R.string.content),imageGetter,null));
                            }
                        }
                    });
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

关于加载网络图片,很多网上的方法都是在子线程中直接进行drawable的创建,这样会导致Android4.4以上系统不能使用和使用过程中很卡的效果,这里我采用Glide进行图片的加载,并进行二次赋值。如果有多张图片显示,我们可以定义一个Map集合,根据图片的地址来进行存取;图片的地址为key,drawable为value值来进行存储。

结束语

在一些特殊场合下使用Html.fromHtml的方法还是比较方便的,关于网络加载图片的方法有兴趣的可以看下源码。使用方法很简单,不懂的或者有更好的方法的小伙伴欢迎留言探讨。哈哈!

更多推荐

Android Html.fromHtml的使用