-
-
Save Antarix/4167655 to your computer and use it in GitHub Desktop.
| 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); | |
| } | |
| } | |
| } | |
| } |
DefaultHttpClient is deprecated. Try HttpURLConnection on fetch method:
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream stream = urlConnection.getInputStream();
return stream;
}
@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....
if(container instanceof TextView) { ((TextView)container).setText(((TextView)container).getText()); }
thx @Antarix! I've tried it. it works.
You can find an improved version here: https://github.com/SufficientlySecure/html-textview/blob/master/HtmlTextView/src/main/java/org/sufficientlysecure/htmltextview/HtmlRemoteImageGetter.java
Not working for me! Text and image is overlapping.