Android 显示富文本

一、TextView 显示

关于 TextView 显示富文本信息,使用 Html.fromHtml() 得到 CharSequence 对象,然后赋值给 TextView 完成显示; Html.fromHtml() 有两个常用的重载方法:
1. fromHtml(String source)
2. fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
区别在于第一个用来显示文字的,第二个还可以显示图片;方法一直接调用即可,没什么好说的,方法二由于要创建 ImageGetter 显示图片,并且加载网络图片需要子线程中处理,所以相关代码如下:

在子线程中创建 ImageGetter, 并调用 fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler) 方法得到 CharSequence 对象,通过 Handler 回到主线程,为 TextView 设置富文本

new Thread(() -> {
            Html.ImageGetter imageGetter = source -> {
                Drawable drawable = getImageFromNetwork(source);
                if (drawable != null) {
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                }
                return drawable;
            };
            CharSequence charSequence = Html.fromHtml(htmlCode, imageGetter, null);
            Message message = mHandler.obtainMessage();
            message.what = 0;
            message.obj = charSequence;
            mHandler.sendMessage(message);
        }).start();
    public Drawable getImageFromNetwork(String imageUrl) {
        Drawable drawable;
        try {
            URL myFileUrl = new URL(imageUrl);
            HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            drawable = Drawable.createFromStream(is, null);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return drawable;
    }

    private static class MyHandler extends Handler {

        WeakReference<Activity> weakReference;

        MyHandler(Activity activity) {
            weakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                weakReference.get().txtView.setText((CharSequence) msg.obj);
                weakReference.get().txtView.setClickable(true);
                weakReference.get().txtView.setMovementMethod(LinkMovementMethod.getInstance());
            }
        }
    }

但是,一运行,GG… 文字的显示样式完全没变化, Html 里面明明设置了一些 style 属性;无奈,祭出 WebView 加载富文本;

二、WebView 显示富文本

关于 WebView、可以加载网页、本地 html 文件、竟然还可以加载 html 代码;6得飞起
1. 对 WebView 进行一些基础设置

        WebSettings webSettings = webView.getSettings();
        webSettings.setDisplayZoomControls(false); //隐藏webview缩放按钮
        webSettings.setJavaScriptEnabled(true);//支持js
//        webSettings.setBuiltInZoomControls(true); // 显示放大缩小
//        webSettings.setSupportZoom(true); // 可以缩放
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 得到 URL 可以传给应用中的某个 WebView 页面加载显示
                return true;
            }
        });
  1. 加载 Html 代码
webView.loadDataWithBaseURL(null, HtmlCode, "text/html", "UTF-8", null);
  1. 注意,加载HTML不要使用 loadData(HtmlCode, “text/html”, “UTF-8”); 会有乱码问题;运行调试,FaKe,图片太宽,文字太小;所以需要将内容压缩在屏幕宽度内;添加代码:
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
  1. 运行,发现图片完全显示在了屏幕内,但是文字还是没什么变化,太小;最后找到方法,利用 Jsoup 显示 WebView,去掉第三步的代码,将第二步改为
webView.loadDataWithBaseURL(null, HtmlFormat.getNewContent(htmlCode), "text/html", "UTF-8", null);
  1. HtmlFormat 如下:需要导入 Jsoup 依赖(compile ‘org.jsoup:jsoup:1.9.2’)
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;

public class HtmlFormat {
     public static String getNewContent(String htmltext) {
         Document doc = Jsoup.parse(htmltext);
         Elements elements = doc.getElementsByTag("img");
         for (Element element : elements) {
             element.attr("width", "100%").attr("height", "auto");
         }
         return doc.toString();
     }
 }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值