2013-03-25 13 views
18

La mia applicazione Android riceve contenuti HTML con immagini al suo interno. È possibile effettuare la funzione fromHTML() per visualizzare le immagini nella stringa HTML che riceve?Android HTML.fromHTML() con immagini?

In caso contrario, come posso recuperare le immagini nella stringa HTML e convertirle in immagini TextView?

Grazie

risposta

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

Uso di 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

il lavoro è abbastanza bene !! +1 –

+0

Cosa succede se l'immagine è String Base64? – berserk

+1

Non ha funzionato abbastanza per me, ma ha migliorato l'approccio, ma altri che hanno problemi con questa risposta potrebbero dare un'occhiata qui come funziona per me! https://stackoverflow.com/questions/16179285/html-imagegetter-textview/16209680#16209680 – Sjd

0

Nota: Si prega di riferire la risposta data da Talha, sto postando questo come una risposta separata per sottolineare la correzione importante per un problema.

Fix per la sovrapposizione di immagini (se più immagini) questione e fissare per sovrapposizione di immagine e testo

soluzione per le questioni di cui sopra: Si prega di chiamare container.setText (container.getText()); alla fine di onPostExecute per evitare la sovrapposizione di immagini.

Problemi correlati