Android textview 加载html格式的内容

今天做的项目要求后台录入html格式的图文并茂的信息,移动端对应要显示html格式的信息。由于需要做wrap_content的展示,放弃使用webview,采用TextView显示。最终效果感觉好于webview。风格比较统一。唯一不太好的是图片的位置好像是靠左,webview是居中。但只要内容不算很复杂,用textview还是可以的。

一开始我发现就算是copy paste前人的代码,显示的内容怎么都是<span xxx>text</span><b>...之类的,一直以为是自己写错了。后来发现后台发过来的代码有encode..就是"<"变成了&lt。 于是就做了两次转换:

Html.fromHtml(Html.fromHtml(text).toString(),imgGetter,null );

这样解决了第一个问题。

第二个要注意的是要把带imageGetter的方法放到非主线程中,因为图片下载不能在主线程里面。

第三个要注意的是非主线程里不能调用textView.setText(text);如果用task就在activity里做回调,如果用thread可以用个handler.sendMessage把结果返回。

另外,如果用webview.loadData()也可以,但有可能遇到中文乱码的情况,正确写法如下:

webView.loadData(html,"text/html; charset=UTF-8", null);

当然,如果字符串是encode过了的,还是要再转一次,如下:

webView.loadData(Html.fromHtml(html).toString(),"text/html; charset=UTF-8", null);

好了,下面就是copy/paste时间了,部分关键代码如下,:

imgGetter = new Html.ImageGetter() {
            public Drawable getDrawable(String source) {
                InputStream is = null;
                try {
                    if(isFinishing()){
                        return null;
                    }
                    is = (InputStream) new URL(source).getContent();
                    Drawable d = Drawable.createFromStream(is, "src");
                    d.setBounds(0, 0, d.getIntrinsicWidth(),
                            d.getIntrinsicHeight());
                    is.close();
                    return d;
                } catch (Exception e) {
                    return null;
                }
            }
        };
loadContentThread=new Thread(new Runnable() {
            @Override
            public void run() {
                String parsedHtml = Html.fromHtml(textOriginal).toString();
                Spanned text =Html.fromHtml(parsedHtml,imgGetter,null );
                Message msg = new Message();
                msg.what=CONTENT_LOAD_FINISH;
                Bundle bundle = new Bundle();
                bundle.putCharSequence("content",text);
                msg.setData(bundle);
                mHandle.sendMessage(msg);
            }
        });
 loadContentThread.start();
private Handler mHandle=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what ==CONTENT_LOAD_FINISH){
               Spanned content = (Spanned)msg.getData().getCharSequence("content");
                mContentView.setText(content);
            }
        }
    };

欢迎多多指正 ^_^ 尽请留言。

转载于:https://my.oschina.net/u/268088/blog/803416

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值