Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to display inline images from html in an Android TextView?

Given the following HTML:

<p>This is text and this is an image <img src="http://www.example.com/image.jpg" />.</p>

Is it possible to make the image render? When using this snippet: mContentText.setText(Html.fromHtml(text));, I get a cyan box with black borders, leading me to believe that a TextView has some idea of what an img tag is.

like image 344
Gunnar Lium Avatar asked May 19 '10 12:05

Gunnar Lium


People also ask

Which tag is used for inline image?

The IMG tag is used to insert images within text. These are often called "inline" images.

Which file we can create ID of TextView instance?

You can create a TextView instance either by declaring it inside a layout XML file or by instantiating it programmatically.

What is the use of TextView?

TextView is the user interface which displays the text message on the screen to the user. It is based on the layout size, style, and color, etc. TextView is used to set and display the text according to our specifications.

What are android TextView widgets?

In android, TextView is a user interface control that is used to set and display the text to the user based on our requirements. The TextView control will act as like label control and it won't allow users to edit the text.


2 Answers

If you have a look at the documentation for Html.fromHtml(text) you'll see it says:

Any <img> tags in the HTML will display as a generic replacement image which your program can then go through and replace with real images.

If you don't want to do this replacement yourself you can use the other Html.fromHtml() method which takes an Html.TagHandler and an Html.ImageGetter as arguments as well as the text to parse.

In your case you could parse null as for the Html.TagHandler but you'd need to implement your own Html.ImageGetter as there isn't a default implementation.

However, the problem you're going to have is that the Html.ImageGetter needs to run synchronously and if you're downloading images from the web you'll probably want to do that asynchronously. If you can add any images you want to display as resources in your application the your ImageGetter implementation becomes a lot simpler. You could get away with something like:

private class ImageGetter implements Html.ImageGetter {      public Drawable getDrawable(String source) {         int id;          if (source.equals("stack.jpg")) {             id = R.drawable.stack;         }         else if (source.equals("overflow.jpg")) {             id = R.drawable.overflow;         }         else {             return null;         }          Drawable d = getResources().getDrawable(id);         d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());         return d;     } }; 

You'd probably want to figure out something smarter for mapping source strings to resource IDs though.

like image 63
Dave Webb Avatar answered Sep 20 '22 00:09

Dave Webb


I have implemented in my app ,taken referece from the pskink.thanx a lot

package com.example.htmltagimg;  import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL;  import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.text.Html.ImageGetter; import android.text.Spanned; import android.util.Log; import android.widget.TextView;  public class MainActivity extends Activity implements ImageGetter { private final static String TAG = "TestImageGetter"; private TextView mTv;  @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     String source = "this is a test of <b>ImageGetter</b> it contains " +             "two images: <br/>" +             "<img src=\"http://developer.android.com/assets/images/dac_logo.png\"><br/>and<br/>" +             "<img src=\"http://www.hdwallpapersimages.com/wp-content/uploads/2014/01/Winter-Tiger-Wild-Cat-Images.jpg\">";     String imgs="<p><img alt=\"\" src=\"http://images.visitcanberra.com.au/images/canberra_hero_image.jpg\" style=\"height:50px; width:100px\" />Test Article, Test Article, Test Article, Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,v</p>";     String src="<p><img alt=\"\" src=\"http://stylonica.com/wp-content/uploads/2014/02/Beauty-of-nature-random-4884759-1280-800.jpg\" />Test Attractions Test Attractions Test Attractions Test Attractions</p>";     String img="<p><img alt=\"\" src=\"/site_media/photos/gallery/75b3fb14-3be6-4d14-88fd-1b9d979e716f.jpg\" style=\"height:508px; width:640px\" />Test Article, Test Article, Test Article, Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,v</p>";     Spanned spanned = Html.fromHtml(imgs, this, null);     mTv = (TextView) findViewById(R.id.text);     mTv.setText(spanned); }  @Override public Drawable getDrawable(String source) {     LevelListDrawable d = new LevelListDrawable();     Drawable empty = getResources().getDrawable(R.drawable.ic_launcher);     d.addLevel(0, 0, empty);     d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());      new LoadImage().execute(source, d);      return d; }  class LoadImage extends AsyncTask<Object, Void, Bitmap> {      private LevelListDrawable mDrawable;      @Override     protected Bitmap doInBackground(Object... params) {         String source = (String) params[0];         mDrawable = (LevelListDrawable) params[1];         Log.d(TAG, "doInBackground " + source);         try {             InputStream is = new URL(source).openStream();             return BitmapFactory.decodeStream(is);         } catch (FileNotFoundException e) {             e.printStackTrace();         } catch (MalformedURLException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         }         return null;     }      @Override     protected void onPostExecute(Bitmap bitmap) {         Log.d(TAG, "onPostExecute drawable " + mDrawable);         Log.d(TAG, "onPostExecute bitmap " + bitmap);         if (bitmap != null) {             BitmapDrawable d = new BitmapDrawable(bitmap);             mDrawable.addLevel(1, 1, d);             mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());             mDrawable.setLevel(1);             // i don't know yet a better way to refresh TextView             // mTv.invalidate() doesn't work as expected             CharSequence t = mTv.getText();             mTv.setText(t);         }     } } } 

As per below @rpgmaker comment i added this answer

yes you can do using ResolveInfo class

check your file is supported with already installed apps or not

using below code:

private boolean isSupportedFile(File file) throws PackageManager.NameNotFoundException {     PackageManager pm = mContext.getPackageManager();     java.io.File mFile = new java.io.File(file.getFileName());     Uri data = Uri.fromFile(mFile);     Intent intent = new Intent(Intent.ACTION_VIEW);     intent.setDataAndType(data, file.getMimeType());     List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);      if (resolveInfos != null && resolveInfos.size() > 0) {         Drawable icon = mContext.getPackageManager().getApplicationIcon(resolveInfos.get(0).activityInfo.packageName);         Glide.with(mContext).load("").placeholder(icon).into(binding.fileAvatar);         return true;     } else {         Glide.with(mContext).load("").placeholder(R.drawable.avatar_defaultworkspace).into(binding.fileAvatar);         return false;     } } 
like image 38
madhu527 Avatar answered Sep 20 '22 00:09

madhu527