2013-03-25 18 views
18

Moja aplikacja na Androida odbiera treść HTML zawierającą obrazy. Czy można wykonać funkcję fromHTML(), aby wyświetlić obrazy w ciągu znaków HTML, który otrzymuje?Android HTML.fromHTML() z obrazami?

Jeśli nie, w jaki sposób mogę pobrać obrazy z ciągu HTML i przekonwertować je na obrazy TextView?

Dzięki

Odpowiedz

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(); 
     } 
    } 
} 

Wykorzystanie 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

działa całkiem dobrze !! +1 –

+0

Co jeśli obraz jest ciągiem Base64? – berserk

+1

Niezupełnie mi się udało, ale uzyskałem poparcie dla tego podejścia, ale inni, którzy mają problem z tą odpowiedzią, mogą sprawdzić, jak to działa dla mnie! https://stackoverflow.com/questions/16179285/html-imagegetter-textview/16209680#16209680 – Sjd

0

Uwaga: Prosimy o przekazanie odpowiedzi udzielonej przez Talhę, publikuję to jako oddzielną odpowiedź, aby wskazać ważną poprawkę dotyczącą problemu.

Fix do pokrywania obrazów (jeśli Wiele obrazów) i rozwiązać problem za nakładanie obrazu i tekstu

rozwiązanie dla powyższych zagadnień: Prosimy zadzwonić container.setText (container.getText()); pod koniec onPostExecute, aby uniknąć nakładania się obrazów.

Powiązane problemy