2013-03-25 40 views
18

Ứng dụng Android của tôi nhận nội dung HTML có hình ảnh trong đó. Có thể thực hiện chức năng fromHTML() để hiển thị hình ảnh trong chuỗi HTML mà nó nhận được không?Android HTML.fromHTML() với hình ảnh?

Nếu không, làm thế nào tôi có thể truy xuất hình ảnh trong chuỗi HTML và chuyển đổi chúng thành hình ảnh TextView?

Cảm ơn

Trả lời

52

URLDrawable.java

public class URLDrawable extends BitmapDrawable { 
    // the drawable that you need to set, you could set the initial drawing 
    // with the loading image if you need to 
    protected Drawable drawable; 

    @Override 
    public void draw(Canvas canvas) { 
     // override the draw to facilitate refresh function later 
     if(drawable != null) { 
      drawable.draw(canvas); 
     } 
    } 
} 

URLImageParser.java

public class URLImageParser implements ImageGetter { 
    Context c; 
    View container; 

    /*** 
    * Construct the URLImageParser which will execute AsyncTask and refresh the container 
    * @param t 
    * @param c 
    */ 
    public URLImageParser(View t, Context c) { 
     this.c = c; 
     this.container = t; 
    } 

    public Drawable getDrawable(String source) { 
     URLDrawable urlDrawable = new URLDrawable(); 

     // get the actual source 
     ImageGetterAsyncTask asyncTask = 
      new ImageGetterAsyncTask(urlDrawable); 

     asyncTask.execute(source); 

     // return reference to URLDrawable where I will change with actual image from 
     // the src tag 
     return urlDrawable; 
    } 

    public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> { 
     URLDrawable urlDrawable; 

     public ImageGetterAsyncTask(URLDrawable d) { 
      this.urlDrawable = d; 
     } 

     @Override 
     protected Drawable doInBackground(String... params) { 
      String source = params[0]; 
      return fetchDrawable(source); 
     } 

     @Override 
     protected void onPostExecute(Drawable result) { 
      // set the correct bound according to the result from HTTP call 
      urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 
        + result.getIntrinsicHeight()); 

      // change the reference of the current drawable to the result 
      // from the HTTP call 
      urlDrawable.drawable = result; 

      // redraw the image by invalidating the container 
      URLImageParser.this.container.invalidate(); 
     } 

     /*** 
     * Get the Drawable from URL 
     * @param urlString 
     * @return 
     */ 
     public Drawable fetchDrawable(String urlString) { 
      try { 
       InputStream is = fetch(urlString); 
       Drawable drawable = Drawable.createFromStream(is, "src"); 
       drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 
         + drawable.getIntrinsicHeight()); 
       return drawable; 
      } catch (Exception e) { 
       return null; 
      } 
     } 

     private InputStream fetch(String urlString) throws MalformedURLException, IOException { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(urlString); 
      HttpResponse response = httpClient.execute(request); 
      return response.getEntity().getContent(); 
     } 
    } 
} 

Sử dụng ImageGetter

String html = "Hello " + 
"<img src='http://www.gravatar.com/avatar/" + 
"f9dd8b16d54f483f22c0b7a7e3d840f9?s=32&d=identicon&r=PG'/>" + 
" This is a test " + 
"<img src='http://www.gravatar.com/avatar/a9317e7f0a78bb10a980cadd9dd035c9?s=32&d=identicon&r=PG'/>"; 

this.textView = (TextView)this.findViewById(R.id.textview); 
URLImageParser p = new URLImageParser(textView, this); 
Spanned htmlSpan = Html.fromHtml(html, p, null); 
textView.setText(htmlSpan); 
+0

hoạt động khá tốt !! +1 –

+0

Nếu hình ảnh là chuỗi Base64 thì sao? – berserk

+1

Không hoàn toàn phù hợp với tôi nhưng đã bỏ phiếu cho phương pháp tiếp cận nhưng những người khác có vấn đề với câu trả lời này có thể có một cái nhìn ở đây vì nó làm việc cho tôi! https://stackoverflow.com/questions/16179285/html-imagegetter-textview/16209680#16209680 – Sjd

0

Lưu ý: Vui lòng tham khảo câu trả lời được đưa ra bởi Talha, tôi đăng bài này dưới dạng câu trả lời riêng để chỉ ra sửa chữa quan trọng cho một vấn đề.

Fix cho chồng chéo của hình ảnh (nếu nhiều hình ảnh) phát hành và sửa chữa cho chồng chéo của hình ảnh và văn bản pháp

cho các vấn đề trên: Vui lòng gọi container.setText (container.getText()); ở cuối onPostExecute để tránh chồng chéo hình ảnh.

Các vấn đề liên quan