93 votes

Comment ajouter une image dans un TextView ?

J'ai fait des recherches sur Google et je suis tombé sur ce site où j'ai trouvé une question similaire à la mienne, à savoir comment inclure une image dans un message d'accueil. TextView texte, par exemple "bonjour je m'appelle [image]" et la réponse était la suivante :

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

Je voudrais savoir dans ce code,

  1. Que suis-je censé taper ou faire dans le contexte ?
  2. Suis-je censé faire quelque chose pour le text.setSpan() comme l'importation ou la référence ou laisser le texte ?

Si quelqu'un peut m'expliquer la situation, j'apprécierais beaucoup.

1voto

user1145905 Points 31

Ceci est en partie basé sur ce qui suit réponse antérieure ci-dessus par @A Boschman . Dans cette solution, j'ai constaté que la taille de l'image en entrée affectait grandement la capacité de makeImageSpan() pour centrer correctement l'image. En outre, j'ai constaté que la solution affectait l'espacement du texte en créant des interlignes inutiles.

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 (i.e. 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);
}

Puis fournissez votre instance de betterImageSpan à spannable.setSpan() comme d'habitude

1voto

Partha Paul Points 121

Disons que c'est notre TextView

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:drawablePadding="4dp"
    android:drawableRight="@drawable/edit"
    android:text="Hello world"
    android:textSize="18dp" />

Maintenant, nous pouvons y ajouter l'une des lignes suivantes selon nos besoins

android:drawableLeft="@drawable/filename"
android:drawableRight="@drawable/filename"
android:drawableTop="@drawable/filename"
android:drawableBottom="@drawable/filename"

0voto

Himanshu saini Points 1

Ceci pourrait vous aider

  SpannableStringBuilder ssBuilder;

        ssBuilder = new SpannableStringBuilder(" ");
        // working code ImageSpan image = new ImageSpan(textView.getContext(), R.drawable.image);
        Drawable image = ContextCompat.getDrawable(textView.getContext(), R.drawable.image);
        float scale = textView.getContext().getResources().getDisplayMetrics().density;
        int width = (int) (12 * scale + 0.5f);
        int height = (int) (18 * scale + 0.5f);
        image.setBounds(0, 0, width, height);
        ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BASELINE);
        ssBuilder.setSpan(
                imageSpan, // Span to add
                0, // Start of the span (inclusive)
                1, // End of the span (exclusive)
                Spanned.SPAN_INCLUSIVE_EXCLUSIVE);// Do not extend the span when text add later

        ssBuilder.append(" " + text);
        ssBuilder = new SpannableStringBuilder(text);
        textView.setText(ssBuilder);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X