Android开发 Html工具类详解

摘要:
fontsize=“3”color=“red”>fontsize=“5”color=“blue”>fontsize=“3”color=“red”>fontsize=“5”color=“blue”>这是一个危机时期<“+”<&书信电报;null);}});}})。start();
前言

  在一些需求富文本显示或者编辑的开发情况下,数据都是用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的格式添加斜杠

效果图:

Android开发 Html工具类详解第1张

显示带图片地址的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();

效果图:

 Android开发 Html工具类详解第2张

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

免责声明:文章转载自《Android开发 Html工具类详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32F4库函数初始化系列:PWM输出MFC对话框和控件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF ListBox CheckBox 里面如何添加字段进行显示

                                                             <Grid DockPanel.Dock="Top" Height="300"> <DockPanel> <Grid DockPanel.Dock="Left" Margin="180,0,0,0">...

07mybatis使用日志框架logback显示sql语句

java 开发领域日志框架 log4j log for java logback 来显示mybatis sql语句 1、在mybatis框架配置文件中 src/main/resource/mybatis-config.xml 加入 <settings> <setting name="logPrefix" value="dao."/>...

Linux kernel 之 uart 驱动解析

uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制。 * #### 在Linux kernel 内部,uart 通常是作为 一个 tty 设备对其进行控制,也是就是一个字符设备文件,可对其进行读写操作。 * #### kernel version 4.4....

centos8安装docker+phpfpm+alpine+nginx+mariadb

2020-3-31 12:51:44 星期二 记录一下安装过程备忘: 1. 宿主机 centos8 安装docker-ce (可参考centos7的安装方法, 没有太大变化) 2. nginx 直接装在宿主机上, 添加一个域名的配置, 将php文件的请求转发到 172.0.0.1:9700 3. php通过docker的方式安装, 基础镜像选择alpine...

Android—TableLayout自定义表格

最近的一个项目中,需要用的表格,由于平时很少用到表格,所以,就准备到网上搜搜,发现可参考的很少,加上,自己也想多了解点TableLayout 布局,所欲就打算自己动手来实现自己需要的表格。先看看需求吧。 如图,上面这几个表格都差不多。主要区别: 1.列数不同 2.列的宽度不一定是均分的。 谈下思路: 从图我们可以看出,表头和表格可以分为两个表。...

Vue中开启关闭风场

<template> <div class="box"> <div ref="emap" id="map"></div> <div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class...