Android 富文本处理

最近遇到了一些富文本处理的坑,特此分享下

TextView

Html.fromHtml(data.getPro_job())
这个方式最简单,缺陷是不能解析ulli等类型标签。

RichText

RichText.from(data.getPro_job()).into(wvDes);

RichText 是Android平台下的富文本解析器,支持Html和Markdown,这样就可以解析ul等标签,但缺陷是字体样式加载会有问题,比如说加粗、颜色等。

WebView

建议使用腾讯x5浏览器,使用方法可查看另一篇博客【Android Web】腾讯X5浏览器的集成与常见问题

webView.loadDataWithBaseURL("", data.getPro_intro(), "text/html", "utf-8", null);

如果不是完整的html,可以手动添加完整标签

   /**
     * 加载html标签
     *
     * @param bodyHTML
     * @return
     */
    private String getHtmlData(String bodyHTML) {
        String head = "<head>" +
                "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +
                "<style>img{max-width: 100%; width:auto; height:auto!important;}</style>" +
                "</head>";
        return "<html>" + head + "<body>" + bodyHTML + "</body></html>";
    }

webview在解析标签上没有问题,但是又引发了另一个问题,ScrollView嵌套下,底部会有一大片的空白。

这个问题有2种处理方式

  • 获取html的内容高度,然后再设置给webview
        wvDes.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView webView, String s) {
                super.onPageFinished(webView, s);
                wvDes.loadUrl("javascript:app.resize(document.body.getBoundingClientRect().height)");
            }
        });

        wvDes.addJavascriptInterface(new WebViewJavaScriptFunction() {
            @Override
            public void onJsFunctionCalled(String tag) {

            }

            @JavascriptInterface
            public void resize(int height) {
                wvDes.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height + 80);
                        wvDes.setLayoutParams(params);
                    }
                }, 100);

            }

        }, "app");

但是,经测试,在部分华为手机上,document.body.getBoundingClientRect().height获取的高度不正确,只能无奈放弃。

  • addView
        mParentLayout.removeAllViews();
        WebView webView = new WebView(this);
        webView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        webView.loadDataWithBaseURL("", data.getPro_intro(), "text/html", "utf-8", null);
        mParentLayout.addView(webView);

推荐阅读更多精彩内容