¿Cómo agregar una imagen en un texto de TextView?

He buscado en Google y encontré este sitio donde encontré una pregunta similar a la mía en la cual cómo incluir una imagen en un texto de TextView , por ejemplo “hola mi nombre es [imagen]” , y la respuesta fue esta:

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

Me gustaría saber en este código,

  1. ¿Qué se supone que debo escribir o hacer en el contexto?
  2. ¿Se supone que debo hacer algo con el text.setSpan() como importar o referencia o dejarlo en el texto?

Si alguien puede analizar esto por mí, sería muy apreciado.

Prueba esto ..

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

También vea esto .. http://developer.android.com/reference/android/widget/TextView.html

Pruebe esto en el archivo 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.AttributeSet; import android.util.Log; import android.widget.TextView; public class TextViewWithImages extends TextView { public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TextViewWithImages(Context context, AttributeSet 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.compile("\\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; } } 

Utilizar:

en res / layout / mylayout.xml :

   

Tenga en cuenta que si coloca TextViewWithImages.java en alguna ubicación que no sea com / xyz / customandroid / , también debe cambiar el nombre del paquete, com.xyz.customandroid anterior.

en res / values ​​/ strings.xml :

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

donde ok16.png y retry16.png son icons en la carpeta res / dibujable /

Esta respuesta se basa en esta excelente respuesta al 18446744073709551615 . Su solución, aunque útil, no dimensiona el ícono de la imagen con el texto circundante. Tampoco establece el color del icono como el del texto circundante.

La siguiente solución toma un icono cuadrado blanco y lo hace ajustarse al tamaño y al color del texto circundante.

 public class TextViewWithImages extends TextView { private static final String DRAWABLE = "drawable"; /** * Regex pattern that looks for embedded images of the format: [img src=imageName/] */ public static final String PATTERN = "\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"; public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TextViewWithImages(Context context, AttributeSet 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.compile(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); } } 

Cómo utilizar:

Simplemente inserte referencias a los íconos deseados en el texto. No importa si el texto se establece programáticamente a través de textView.setText(R.string.string_resource); o si está configurado en xml.

Para insertar un icono dibujable llamado example.png, incluya la siguiente cadena en el texto: [img src=example/] .

Por ejemplo, un recurso de cadena podría verse así:

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

Intenté muchas soluciones diferentes y esta fue la mejor para mí:

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

Este código usa un mínimo de memoria.

Esto se basa en parte en esta respuesta anterior de @A Boschman . En esa solución, descubrí que el tamaño de entrada de la imagen afectaba en gran medida la capacidad de makeImageSpan() para alinear correctamente la imagen. Además, descubrí que la solución afectaba el espaciado de texto al crear un espacio de línea innecesario.

Encontré BaseImageSpan (de la biblioteca Fresco de Facebook) para hacer el trabajo particularmente 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); } 

A continuación, proporcione su instancia de spannable.setSpan() a spannable.setSpan() como de costumbre