zoukankan      html  css  js  c++  java
  • Android开发 Html工具类详解

    前言

      在一些需求富文本显示或者编辑的开发情况下,数据都是用html的格式来保存文本信息的.而google是有提供解析html的工具类那就是Html.有了Html可以让TextView也支持富文本(其实原理还是解析Html然后在转成SpannableString再给TextView显示)

    显示Html格式文本

            String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" +
                            "<b><font size="5" color="blue">今天下三分</font></font></b></br>" +
                            "<h1>益州疲弊,此诚危急存亡之秋也</h1></br>";
            mTextView.setText(Html.fromHtml(htmlContent));

    htmlContent是一段html的格式内容的文本,而让TextView显示富文本内容只需要轻松的调用Html.fromHtml(htmlContent)即可. 而Html.fromHtml则是将html转成了Spanned
    另外注意!html格式里的"引号需要按照java的格式添加斜杠

    效果图:

    显示带图片地址的Html

            final String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" +
                    "<b><font size="5" color="blue">今天下三分</font></font></b></br>" +
                    "<h1>益州疲弊,此诚危急存亡之秋也</h1></br>" +
                    "</p><img src="http://n.sinaimg.cn/sinacn/w450h212/20171223/16c3-fypvuqf3150782.jpg"";
    
            new Thread(new Runnable() { //从网络中下载图片是耗时操作,所以需要使用线程.还有mSpanned = Html.fromHtml()的创建其实也是异步耗时的.
                @Override
                public void run() {
                    mSpanned = Html.fromHtml(htmlContent, new Html.ImageGetter() {
                        @Override
                        public Drawable getDrawable(String source) {
                            Drawable drawable = null;
                            try {
                                drawable = Drawable.createFromStream(new URL(source).openStream(), "image.jpg");//下载图片
                                drawable.setBounds(0, 0, 200, 200);//设置图片显示范围
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            return drawable;
                        }
                    }, null);
    
                    runOnUiThread(new Runnable() { //切换到主线程设置内容
                        @Override
                        public void run() {
                            mTextView.setText(mSpanned);
                        }
                    });
                }
            }).start();

    效果图:

     

    SpannableString转成Html格式文本

      能正着转,那么当然能反着转.下面我们来演示SpannableString转成Html格式文本

            String content = "先帝创业未半而中道崩殂
    今天下三分益州疲弊,
    此诚危急存亡之秋也";
            SpannableString spannableString = new SpannableString(content);
            spannableString.setSpan(new ForegroundColorSpan(Color.RED)
                    , content.indexOf("先帝")
                    , content.indexOf("
    今")
                    , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new StyleSpan(Typeface.BOLD)
                    , content.indexOf("殂
    ")
                    , content.indexOf("此诚")
                    , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    
            Log.e(TAG, "SpannableString转成html:"+Html.toHtml(spannableString));

    结果:

    2019-07-23 14:36:53.271 11620-11620/demo.yt.com.demo E/demo.yt.com.demo.MainActivity: SpannableString转成html:<p dir="ltr"><span style="color:#FF0000;">&#20808;&#24093;&#21019;&#19994;&#26410;&#21322;&#32780;&#20013;&#36947;&#23849;</span><span style="color:#FF0000;"><b>&#27522;</b></span><br>
        <b>&#20170;&#22825;&#19979;&#19977;&#20998;&#30410;&#24030;&#30130;&#24330;,</b><br>
        &#27492;&#35802;&#21361;&#24613;&#23384;&#20129;&#20043;&#31179;&#20063;</p>

    中文部分也被转成了unicode编码,不过不用担心,直接给TextView 是可以正常显示中文的.

    舍弃Html格式,提取文本内容

    SpannableString直接提取文本(UTF-8格式)

    Spanned spanned = Html.fromHtml(htmlContent);//htmlContent是String类型的html文本
    SpannableString spannableString = new SpannableString(spanned);
    holder.itemText.setText(spannableString.toString());

    推荐使用这种方式,直接utf-8无需转换.

    SpannableString用Html类提取文本内容(会变成unicode格式编码,此方法及供参考)

            String content = "先帝创业未半而中道崩殂
    今天下三分益州疲弊,
    此诚危急存亡之秋也";
            SpannableString spannableString = new SpannableString(content);
            spannableString.setSpan(new ForegroundColorSpan(Color.RED)
                    , content.indexOf("先帝")
                    , content.indexOf("
    今")
                    , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new StyleSpan(Typeface.BOLD)
                    , content.indexOf("殂
    ")
                    , content.indexOf("此诚")
                    , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    
            Log.e(TAG, "提取文本:"+Html.escapeHtml(spannableString));

    结果:

    2019-07-23 14:38:56.132 11753-11753/demo.yt.com.demo E/demo.yt.com.demo.MainActivity: 提取文本:&#20808;&#24093;&#21019;&#19994;&#26410;&#21322;&#32780;&#20013;&#36947;&#23849;&#27522;&#10;&#20170;&#22825;&#19979;&#19977;&#20998;&#30410;&#24030;&#30130;&#24330;,&#10;&#27492;&#35802;&#21361;&#24613;&#23384;&#20129;&#20043;&#31179;&#20063;

    一样中文部分也被转成了unicode编码.

    Html里提取内容文本内容(会变成unicode格式编码,此方法及供参考)

            String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" +
                    "<b><font size="5" color="blue">今天下三分</font></font></b></br>" +
                    "<h1>益州疲弊,此诚危急存亡之秋也</h1></br>";
            Spanned spanned = Html.fromHtml(htmlContent);
            Log.e(TAG, "提取文本:"+Html.escapeHtml(spanned));

    结果也是跟上面一样

     

    END

  • 相关阅读:
    SSH 远程执行任务
    C# 创建压缩文件
    迁移 SQL Server 到 Azure SQL 实战
    在 Azure 上部署 Asp.NET Core Web App
    linux kill 命令
    VS 远程调试 Azure Web App
    Azure 基础:自定义 Table storage 查询条件
    NSOperation的使用细节 [2]
    NSOperation的使用细节 [1]
    [翻译] SSKeychain
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/11231014.html
Copyright © 2011-2022 走看看