Est-il possible d’afficher des images en ligne à partir de HTML dans un TextView Android?

Compte tenu du code HTML suivant:

This is text and this is an image .

Est-il possible de rendre l’image? Lorsque vous utilisez cet extrait: mContentText.setText(Html.fromHtml(text)); , Je reçois une boîte cyan avec des bordures noires, ce qui m’amène à croire qu’un TextView a une idée de ce qu’est une balise img.

Si vous consultez la documentation de Html.fromHtml(text) vous verrez qu’il dit:

Toutes les balises dans le code HTML s’afficheront comme une image de remplacement générique que votre programme peut ensuite parcourir et remplacer par des images réelles.

Si vous ne voulez pas faire ce remplacement vous-même, vous pouvez utiliser l’autre méthode Html.fromHtml() qui prend comme arguments Html.TagHandler et Html.ImageGetter ainsi que le texte à parsingr.

Dans votre cas, vous pouvez parsingr null comme pour Html.TagHandler mais vous devez implémenter votre propre Html.ImageGetter car il n’y a pas d’implémentation par défaut.

Cependant, le problème que vous allez rencontrer est que Html.ImageGetter doit s’exécuter de manière synchrone et que si vous téléchargez des images à partir du Web, vous voudrez probablement le faire de manière asynchrone. Si vous pouvez append des images que vous souhaitez afficher en tant que ressources dans votre application, votre implémentation ImageGetter sera beaucoup plus simple. Vous pourriez sortir avec quelque chose comme:

 private class ImageGetter implements Html.ImageGetter { public Drawable getDrawable(Ssortingng 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.getInsortingnsicWidth(),d.getInsortingnsicHeight()); return d; } }; 

Vous voudrez probablement trouver quelque chose de plus intelligent pour mapper les chaînes sources aux ID de ressources.

J’ai mis en œuvre dans mon application, pris referece du pskink .thanx beaucoup

 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 Ssortingng TAG = "TestImageGetter"; private TextView mTv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Ssortingng source = "this is a test of ImageGetter it contains " + "two images: 
" + "
and
" + ""; Ssortingng imgs="

\"\"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

"; Ssortingng src="

\"\"Test Attractions Test Attractions Test Attractions Test Attractions

"; Ssortingng img="

\"\"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

"; Spanned spanned = Html.fromHtml(imgs, this, null); mTv = (TextView) findViewById(R.id.text); mTv.setText(spanned); } @Override public Drawable getDrawable(Ssortingng source) { LevelListDrawable d = new LevelListDrawable(); Drawable empty = getResources().getDrawable(R.drawable.ic_launcher); d.addLevel(0, 0, empty); d.setBounds(0, 0, empty.getInsortingnsicWidth(), empty.getInsortingnsicHeight()); new LoadImage().execute(source, d); return d; } class LoadImage extends AsyncTask { private LevelListDrawable mDrawable; @Override protected Bitmap doInBackground(Object... params) { Ssortingng source = (Ssortingng) 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); } } } }

Comme ci-dessous, @rpgmaker comment j’ai ajouté cette réponse

oui vous pouvez faire en utilisant la classe ResolveInfo

vérifiez que votre fichier est pris en charge avec les applications déjà installées ou non

en utilisant le code ci-dessous:

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

C’est ce que j’utilise, qui n’a pas besoin de forcer vos noms de ressources et recherchera d’abord les ressources pouvant être dessinées dans les ressources de vos applications, puis dans les ressources Android stockées si rien n’a été trouvé.

 private class ImageGetter implements Html.ImageGetter { public Drawable getDrawable(Ssortingng source) { int id; id = getResources().getIdentifier(source, "drawable", getPackageName()); if (id == 0) { // the drawable resource wasn't found in our package, maybe it is a stock android drawable? id = getResources().getIdentifier(source, "drawable", "android"); } if (id == 0) { // prevent a crash if the resource still can't be found return null; } else { Drawable d = getResources().getDrawable(id); d.setBounds(0,0,d.getInsortingnsicWidth(),d.getInsortingnsicHeight()); return d; } } } 

Qui peut être utilisé tel quel (exemple):

 Ssortingng myHtml = "This will display an image to the right "; myTextview.setText(Html.fromHtml(myHtml, new ImageGetter(), null); 

J’ai rencontré le même problème et j’ai trouvé une solution assez propre: Après Html.fromHtml (), vous pouvez exécuter une AsyncTask qui parcourt toutes les balises, récupère les images et les affiche ensuite.

Ici vous pouvez trouver du code que vous pouvez utiliser (mais il nécessite une certaine personnalisation): https://gist.github.com/1190397

J’ai utilisé la réponse de Dave Webb mais je l’ai un peu simplifiée. Tant que les ID de ressource restront les mêmes pendant l’exécution dans votre cas d’utilisation, il n’y a pas vraiment besoin d’écrire votre propre classe implémentant Html.ImageGetter et de Html.ImageGetter avec les chaînes source.

Ce que j’ai fait était d’utiliser l’ID de la ressource en tant que chaîne source:

 final Ssortingng img = Ssortingng.format("", R.drawable.your_image); final Ssortingng html = Ssortingng.format("Image: %s", img); 

et l’utiliser directement:

 Html.fromHtml(html, new Html.ImageGetter() { @Override public Drawable getDrawable(final Ssortingng source) { Drawable d = null; try { d = getResources().getDrawable(Integer.parseInt(source)); d.setBounds(0, 0, d.getInsortingnsicWidth(), d.getInsortingnsicHeight()); } catch (Resources.NotFoundException e) { Log.e("log_tag", "Image not found. Check the ID.", e); } catch (NumberFormatException e) { Log.e("log_tag", "Source ssortingng not a valid resource ID.", e); } return d; } }, null); 

Vous pouvez également écrire votre propre parsingur pour extraire l’URL de toutes les images, puis créer dynamicment de nouvelles images et transmettre les URL.

De plus, si vous voulez faire le remplacement vous-même, le caractère à rechercher est [].

Mais si vous utilisez Eclipse, cela va faire peur lorsque vous tapez cette lettre dans une instruction [replace] indiquant que celle-ci est en conflit avec Cp1252 – il s’agit d’un bogue Eclipse. Pour le réparer, allez à

Fenêtre -> Préférences -> Général -> Espace de travail -> Encodage de fichier texte,

et sélectionnez [UTF-8]

Si quelqu’un pense que les ressources doivent être déclaratives et que l’utilisation de Spannable pour plusieurs langues est un gâchis, j’ai effectué une vue personnalisée

 import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.text.Html; import android.text.Html.ImageGetter; import android.text.Spanned; import android.util.AtsortingbuteSet; import android.widget.TextView; /** * XXX does not support android:drawable, only current app packaged icons * * Use it with ssortingngs like  with image in between]]> * assuming there is @drawable/some_image in project files * * Must be accompanied by styleable *  *  *  */ public class HtmlTextView extends TextView { public HtmlTextView(Context context, AtsortingbuteSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAtsortingbutes(attrs, R.styleable.HtmlTextView); Ssortingng html = context.getResources().getSsortingng(typedArray.getResourceId(R.styleable.HtmlTextView_android_text, 0)); typedArray.recycle(); Spanned spannedFromHtml = Html.fromHtml(html, new DrawableImageGetter(), null); setText(spannedFromHtml); } private class DrawableImageGetter implements ImageGetter { @Override public Drawable getDrawable(Ssortingng source) { Resources res = getResources(); int drawableId = res.getIdentifier(source, "drawable", getContext().getPackageName()); Drawable drawable = res.getDrawable(drawableId, getContext().getTheme()); int size = (int) getTextSize(); int width = size; int height = size; // int width = drawable.getInsortingnsicWidth(); // int height = drawable.getInsortingnsicHeight(); drawable.setBounds(0, 0, width, height); return drawable; } } } 

suivre les mises à jour, le cas échéant, à l’ adresse https://gist.github.com/logcat/64234419a935f1effc67