Comment append une image dans un texte TextView?

J’ai cherché sur Google et je suis tombé sur ce site où j’ai trouvé une question similaire à la mienne sur la façon d’inclure une image dans un texte TextView , par exemple “bonjour mon nom est [image]” .

 ImageSpan is = new ImageSpan(context, resId); text.setSpan(is, index, index + strLength, 0); 

Je voudrais savoir dans ce code,

  1. Qu’est-ce que je suis censé taper ou faire dans le contexte?
  2. Suis-je censé faire quelque chose au text.setSpan() comme importer ou référencer ou laisser le texte?

Si quelqu’un peut le décomposer, ce serait très apprécié.

Essaye ça ..

  txtview.setCompoundDrawablesWithInsortingnsicBounds( R.drawable.image, 0, 0, 0); 

Voir aussi ceci. http://developer.android.com/reference/android/widget/TextView.html

Essayez ceci dans un fichier xml

   

com / xyz / customandroid / TextViewWithImages .java :

 import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.text.Spannable; import android.text.style.ImageSpan; import android.util.AtsortingbuteSet; import android.util.Log; import android.widget.TextView; public class TextViewWithImages extends TextView { public TextViewWithImages(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } public TextViewWithImages(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public TextViewWithImages(Context context) { super(context); } @Override public void setText(CharSequence text, BufferType type) { Spannable s = getTextWithImages(getContext(), text); super.setText(s, BufferType.SPANNABLE); } private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); private static boolean addImages(Context context, Spannable spannable) { Pattern refImg = Pattern.comstack("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"); boolean hasChanges = false; Matcher matcher = refImg.matcher(spannable); while (matcher.find()) { boolean set = true; for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) { if (spannable.getSpanStart(span) >= matcher.start() && spannable.getSpanEnd(span) <= matcher.end() ) { spannable.removeSpan(span); } else { set = false; break; } } String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim(); int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName()); if (set) { hasChanges = true; spannable.setSpan( new ImageSpan(context, id), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); } } return hasChanges; } private static Spannable getTextWithImages(Context context, CharSequence text) { Spannable spannable = spannableFactory.newSpannable(text); addImages(context, spannable); return spannable; } } 

Utilisation:

dans res / layout / mylayout.xml :

   

Notez que si vous placez TextViewWithImages.java dans un emplacement autre que com / xyz / customandroid / , vous devez également modifier le nom du package, com.xyz.customandroid ci-dessus.

dans res / values ​​/ ssortingngs.xml :

 Press [img src=ok16/] to accept or [img src=retry16/] to retry 

ok16.png et retry16.png sont des icons dans le dossier res / drawable /

Cette réponse est basée sur cette excellente réponse par 18446744073709551615 . Leur solution, bien qu’utile, ne taille pas l’icône de l’image avec le texte qui l’entoure. Il ne définit pas non plus la couleur de l’icône sur celle du texte environnant.

La solution ci-dessous prend une icône blanche et carrée et l’adapte à la taille et à la couleur du texte environnant.

 public class TextViewWithImages extends TextView { private static final Ssortingng DRAWABLE = "drawable"; /** * Regex pattern that looks for embedded images of the format: [img src=imageName/] */ public static final Ssortingng PATTERN = "\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"; public TextViewWithImages(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } public TextViewWithImages(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public TextViewWithImages(Context context) { super(context); } @Override public void setText(CharSequence text, BufferType type) { final Spannable spannable = getTextWithImages(getContext(), text, getLineHeight(), getCurrentTextColor()); super.setText(spannable, BufferType.SPANNABLE); } private static Spannable getTextWithImages(Context context, CharSequence text, int lineHeight, int colour) { final Spannable spannable = Spannable.Factory.getInstance().newSpannable(text); addImages(context, spannable, lineHeight, colour); return spannable; } private static boolean addImages(Context context, Spannable spannable, int lineHeight, int colour) { final Pattern refImg = Pattern.comstack(PATTERN); boolean hasChanges = false; final Matcher matcher = refImg.matcher(spannable); while (matcher.find()) { boolean set = true; for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) { if (spannable.getSpanStart(span) >= matcher.start() && spannable.getSpanEnd(span) <= matcher.end()) { spannable.removeSpan(span); } else { set = false; break; } } final String resName = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim(); final int id = context.getResources().getIdentifier(resName, DRAWABLE, context.getPackageName()); if (set) { hasChanges = true; spannable.setSpan(makeImageSpan(context, id, lineHeight, colour), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); } } return hasChanges; } /** * Create an ImageSpan for the given icon drawable. This also sets the image size and colour. * Works best with a white, square icon because of the colouring and resizing. * * @param context The Android Context. * @param drawableResId A drawable resource Id. * @param size The desired size (ie width and height) of the image icon in pixels. * Use the lineHeight of the TextView to make the image inline with the * surrounding text. * @param colour The colour (careful: NOT a resource Id) to apply to the image. * @return An ImageSpan, aligned with the bottom of the text. */ private static ImageSpan makeImageSpan(Context context, int drawableResId, int size, int colour) { final Drawable drawable = context.getResources().getDrawable(drawableResId); drawable.mutate(); drawable.setColorFilter(colour, PorterDuff.Mode.MULTIPLY); drawable.setBounds(0, 0, size, size); return new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM); } } 

Comment utiliser:

Intégrez simplement des références aux icons souhaitées dans le texte. Peu importe que le texte soit défini par programmation via textView.setText(R.ssortingng.ssortingng_resource); ou si elle est définie dans XML.

Pour incorporer une icône pouvant être dessinée appelée example.png, incluez la chaîne suivante dans le texte: [img src=example/] .

Par exemple, une ressource de chaîne peut ressembler à ceci:

 This [img src=example/] is an icon. 

J’ai essayé beaucoup de solutions différentes et ce fut pour moi le meilleur:

 SpannableSsortingngBuilder ssb = new SpannableSsortingngBuilder(" Hello world!"); ssb.setSpan(new ImageSpan(context, R.drawable.image), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); tv_text.setText(ssb, TextView.BufferType.SPANNABLE); 

Ce code utilise un minimum de mémoire.

Ceci est en partie basé sur cette réponse précédente de @A Boschman . Dans cette solution, j’ai constaté que la taille d’entrée de l’image affectait grandement la capacité de makeImageSpan() à aligner correctement l’image. En outre, j’ai constaté que la solution affectait l’espacement du texte en créant un espacement de lignes inutile.

J’ai trouvé BaseImageSpan (de la bibliothèque Fresco de Facebook) pour faire le travail particulièrement bien:

  /** * Create an ImageSpan for the given icon drawable. This also sets the image size. Works best * with a square icon because of the sizing * * @param context The Android Context. * @param drawableResId A drawable resource Id. * @param size The desired size (ie width and height) of the image icon in pixels. * Use the lineHeight of the TextView to make the image inline with the * surrounding text. * @return An ImageSpan, aligned with the bottom of the text. */ private static BetterImageSpan makeImageSpan(Context context, int drawableResId, int size) { final Drawable drawable = context.getResources().getDrawable(drawableResId); drawable.mutate(); drawable.setBounds(0, 0, size, size); return new BetterImageSpan(drawable, BetterImageSpan.ALIGN_CENTER); } 

Fournissez ensuite votre instance spannable.setSpan() à spannable.setSpan() comme d’habitude