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 = "先帝創業未半而中道崩殂\n今天下三分益州疲弊,\n此誠危急存亡之秋也";
        SpannableString spannableString = new SpannableString(content);
        spannableString.setSpan(new ForegroundColorSpan(Color.RED)
                , content.indexOf("先帝")
                , content.indexOf("\n今")
                , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new StyleSpan(Typeface.BOLD)
                , content.indexOf("殂\n")
                , 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 = "先帝創業未半而中道崩殂\n今天下三分益州疲弊,\n此誠危急存亡之秋也";
        SpannableString spannableString = new SpannableString(content);
        spannableString.setSpan(new ForegroundColorSpan(Color.RED)
                , content.indexOf("先帝")
                , content.indexOf("\n今")
                , Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new StyleSpan(Typeface.BOLD)
                , content.indexOf("殂\n")
                , 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM