Android Html.fromHtml的使用

在项目中遇到了需要使用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的方法还是比较方便的,关于网络加载图片的方法有兴趣的可以看下源码。使用方法很简单,不懂的或者有更好的方法的小伙伴欢迎留言探讨。哈哈!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android Studio是一款用于开发Android应用程序的集成开发环境(IDE)。其中,html.fromhtmlAndroid Studio提供的一个方法,用于将HTML格式的字符串转换成可显示的文本。 html.fromhtml方法通过解析HTML代码,并将其转换为Spanned对象。Spanned对象是一个包含了不同样式(如字体、颜色、格式等)的文本对象,可以在Android应用中进行渲染和显示。 使用html.fromhtml方法非常简单,只需要将需要转换的HTML代码作为参数传入即可。例如,如果我们有一个包含HTML标签的字符串: String htmlString = "<h1>这是标题<h1><p>这是正文</p>"; Spanned spannedText = Html.fromHtml(htmlString); 通过这两行代码,我们就可以将HTML格式的字符串转换为可供Android应用程序渲染和显示的文本对象。我们可以将该对象设置到TextView或其他支持Spanned对象显示的组件中。例如: TextView textView = findViewById(R.id.textview); textView.setText(spannedText); 这样,我们就可以在应用中看到经过HTML格式化后的文本内容。 需要注意的是,html.fromhtml方法默认只支持部分HTML标签的解析,比如<h1>、<p>等常见标签。如果需要支持更多标签或自定义样式,可以为html.fromhtml方法提供一个Html.TagHandler对象的实例,通过对HTML标签进行处理来实现自定义样式的显示。 总之,android studio的html.fromhtml方法提供了方便的功能,可以将HTML格式的字符串转换为Spanned对象,并在Android应用程序中进行显示和渲染。这为我们开发具有丰富文本显示需求的应用程序提供了一种简单的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值