Created
November 29, 2012 08:48
-
-
Save Antarix/4167655 to your computer and use it in GitHub Desktop.
UrlImage Parser for android TextView to load Html Image tag
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.IOException; | |
import java.io.InputStream; | |
import java.net.MalformedURLException; | |
import org.apache.http.HttpResponse; | |
import org.apache.http.client.methods.HttpGet; | |
import org.apache.http.impl.client.DefaultHttpClient; | |
import android.content.Context; | |
import android.graphics.Canvas; | |
import android.graphics.drawable.BitmapDrawable; | |
import android.graphics.drawable.Drawable; | |
import android.os.AsyncTask; | |
import android.text.Html.ImageGetter; | |
import android.view.View; | |
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(); | |
} | |
} | |
@SuppressWarnings("deprecation") | |
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); | |
} | |
} | |
} | |
} |
if(container instanceof TextView) { ((TextView)container).setText(((TextView)container).getText()); }
thx @Antarix! I've tried it. it works.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@UmaYalanati and @caman9119
I have the same issue for setting the image below the text and i tried to apply ur given solution that is
URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container
container.setText(container.getText());
but the last line of setting text gives error as this method is not present for that container. Looking for reply ASAP....