今天作的項目要求後臺錄入html格式的圖文並茂的信息,移動端對應要顯示html格式的信息。因爲須要作wrap_content的展現,放棄使用webview,採用TextView顯示。最終效果感受好於webview。風格比較統一。惟一不太好的是圖片的位置好像是靠左,webview是居中。但只要內容不算很複雜,用textview仍是能夠的。html
一開始我發現就算是copy paste前人的代碼,顯示的內容怎麼都是<span xxx>text</span><b>...之類的,一直覺得是本身寫錯了。後來發現後臺發過來的代碼有encode..就是"<"變成了<。 因而就作了兩次轉換: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); } } };
歡迎多多指正 ^_^ 盡請留言。