Android textview 加載html格式的內容

今天作的項目要求後臺錄入html格式的圖文並茂的信息,移動端對應要顯示html格式的信息。因爲須要作wrap_content的展現,放棄使用webview,採用TextView顯示。最終效果感受好於webview。風格比較統一。惟一不太好的是圖片的位置好像是靠左,webview是居中。但只要內容不算很複雜,用textview仍是能夠的。html

一開始我發現就算是copy paste前人的代碼,顯示的內容怎麼都是<span xxx>text</span><b>...之類的,一直覺得是本身寫錯了。後來發現後臺發過來的代碼有encode..就是"<"變成了&lt。 因而就作了兩次轉換:java

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

這樣解決了第一個問題。ide

第二個要注意的是要把帶imageGetter的方法放到非主線程中,由於圖片下載不能在主線程裏面。spa

第三個要注意的是非主線程裏不能調用textView.setText(text);若是用task就在activity裏作回調,若是用thread能夠用個handler.sendMessage把結果返回。線程

另外,若是用webview.loadData()也能夠,但有可能遇到中文亂碼的狀況,正確寫法以下:code

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

固然,若是字符串是encode過了的,仍是要再轉一次,以下:圖片

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

好了,下面就是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);
            }
        }
    };

歡迎多多指正 ^_^ 盡請留言。

相關文章
相關標籤/搜索