Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ImageGetter images overlapping text

Tags:

I'm trying to load a block of HTML into a TextView, including images, using

URLImageParser p = new URLImageParser(articleBody, this); Spanned htmlSpan = Html.fromHtml(parsedString, p, null); 

parsedString is the HTML, by the way. Anyway, it loads up, but the images aren't having any space created for them to sit in, so they end up overlapping the text above them. Here's my URLImageParser file:

public class URLImageParser implements Html.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         Log.d("height",""+result.getIntrinsicHeight());         Log.d("width",""+result.getIntrinsicWidth());         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 {             URL aURL = new URL(urlString);             final URLConnection conn = aURL.openConnection();              conn.connect();              final BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());              final Bitmap bm = BitmapFactory.decodeStream(bis);             Drawable drawable = new BitmapDrawable(bm);             drawable.setBounds(0,0,bm.getWidth(),bm.getHeight());             return drawable;         } catch (Exception e) {             return null;         }      } } 

}

Any ideas? Thanks a ton.

like image 912
Nick Avatar asked Oct 24 '11 00:10

Nick


2 Answers

You could change your cointainer c (view) to a textView and then make your onPostExecute look like this:

@Override  protected void onPostExecute(Drawable result) {      // set the correct bound according to the result from HTTP call      Log.d("height",""+result.getIntrinsicHeight());      Log.d("width",""+result.getIntrinsicWidth());      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();      // For ICS     URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()      + result.getIntrinsicHeight()));      // Pre ICS     URLImageParser.this.textView.setEllipsize(null); }  

This will first draw the image and then immediately set the height of the TextView to the drawable's height + the TextViews height

like image 115
Martin S Avatar answered Sep 21 '22 16:09

Martin S


I don't have enough reputation to vote up for Martin S,but his answer is really helpful。And if TextView has displayed a default image before loading,we can change the setHeight() method like this:

    URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()  + result.getIntrinsicHeight()-mDefaultDrawable.getInstrinsicHeight())); 
like image 42
llb Avatar answered Sep 22 '22 16:09

llb