Android TextView使用HTML處理字體樣式、顯示圖片等

項目上有個需求:後臺想直接控制文字的格式樣式和添加圖片。像網頁一樣修改好了整個網頁通過接口給我,讓我顯示在消息提示框裏。

怎麼用TextView控件顯示帶有格式的文字,可否使用Html佈局?查了下Android 幫助文檔,其提供了android.text.Html類和Html.ImageGetter、Html.TagHandler接口

        其實本不打算寫這篇博文的,但看到網絡上關於此的文章,找了好多資料,文本顯示很簡單,就是這個圖就是加載不出來



我把代碼貼一下:

html = "<html><head><title>TextView使用HTML</title></head><body><p><strong>強調</strong></p><p><em>斜體</em></p>"
				+ "<p><a href=\"http://www.dreamdu.com/xhtml/\">超鏈接HTML入門</a>學習HTML!</p><p><font color=\"#aabb00\">顏色1"
				+ "</p><p><font color=\"#00bbaa\">顏色2</p><h1>標題1</h1><h3>標題2</h3><h6>標題3</h6><p>大於>小於<</p><p>"
				+ "下面是網絡圖片</p><img src=\"http://avatar.csdn.net/0/3/8/1_zhang957411207.jpg\"/></body></html>";
		text = (TextView) findViewById(R.id.text_html);
		text.setMovementMethod(ScrollingMovementMethod.getInstance());// 滾動
		mImageGetter = new NetworkImageGetter(); 
		text.setText(Html.fromHtml(html,mImageGetter , null ));
如果不顯示圖這樣就可以了:
text.setText(Html.fromHtml(html));

圖片需要第二個參數

API:   Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler);

下面是第二個參數的類(也可以用匿名內部類的寫法直接new):

/** 
     * 網絡圖片 
     * @author Susie 
     */  
    private final class NetworkImageGetter implements Html.ImageGetter{  
  
        @Override  
        public Drawable getDrawable(String source) {  
              
            Drawable drawable = null;  
            // 封裝路徑  
            File file = new File(Environment.getExternalStorageDirectory(), picName);  
            // 判斷是否以http開頭  
            if(source.startsWith("http")) {  
                // 判斷路徑是否存在  
                if(file.exists()) {  
                    // 存在即獲取drawable  
                    drawable = Drawable.createFromPath(file.getAbsolutePath());  
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
                } else {  
                    // 不存在即開啓異步任務加載網絡圖片  
                    AsyncLoadNetworkPic networkPic = new AsyncLoadNetworkPic();  
                    networkPic.execute(source);  
                }  
            }  
            return drawable;  
        }  
    }  

圖片本地的名字:

/**網絡圖片name*/  
    private String picName = "networkPic.jpg";
先加載本地,如果本地沒有就開始下載。
異步下載:

/** 
     * 加載網絡圖片異步類 
     * @author Susie 
     */  
    private final class AsyncLoadNetworkPic extends AsyncTask<String, Integer, Void>{  
  
        @Override  
        protected Void doInBackground(String... params) {  
            // 加載網絡圖片  
            loadNetPic(params);  
            return null;  
        }  
          
        @Override  
        protected void onPostExecute(Void result) {  
            super.onPostExecute(result);  
            // 當執行完成後再次爲其設置一次  
            text.setText(Html.fromHtml(html, mImageGetter, null));  
        }  
        /**加載網絡圖片*/  
        private void loadNetPic(String... params) {  
            String path = params[0];  
              
            File file = new File(Environment.getExternalStorageDirectory(), picName);  
              
            InputStream in = null;  
              
            FileOutputStream out = null;  
              
            try {  
                URL url = new URL(path);  
                  
                HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();  
                  
                connUrl.setConnectTimeout(5000);  
                  
                connUrl.setRequestMethod("GET");  
                  
                if(connUrl.getResponseCode() == 200) {  
                      
                    in = connUrl.getInputStream();  
                      
                    out = new FileOutputStream(file);  
                      
                    byte[] buffer = new byte[1024];  
                      
                    int len;  
                      
                    while((len = in.read(buffer))!= -1){  
                        out.write(buffer, 0, len);  
                    }  
                } else {  
                    Log.e("123", connUrl.getResponseCode() + "");  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                  
                if(in != null) {  
                    try {  
                        in.close();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
                if(out != null) {  
                    try {  
                        out.close();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  
成功加載:


希望能幫到你。。。。。。




發佈了67 篇原創文章 · 獲贊 121 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章