336 votes

Définir de manière programmatique le dessinable gauche d'un TextView

J'ai un textView en xml ici.

<TextView
        android:id="@+id/bookTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/checkmark"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="24dip"
        android:maxLines="1"
        android:ellipsize="end"/>

Comme vous pouvez le voir, j'ai défini le DrawableLeft dans le fichier xml.

Je voudrais changer le drawable dans le code.

Y a-t-il un moyen de le faire ? Ou définir le drawableLeft dans le code de l'affichage du texte ?

895voto

BrainCrash Points 3757

Vous pouvez utiliser setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)

mettez 0 là où vous ne voulez pas d'images

Exemple pour Drawable à gauche :

TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

Alternativement, vous pouvez utiliser setCompoundDrawablesRelativeWithIntrinsicBounds pour respecter les mises en page RTL/LTR.


Astuce : Lorsque vous connaissez un attribut XML mais que vous ne savez pas comment l'utiliser au moment de l'exécution, il vous suffit de consulter la description de cette propriété dans la documentation du développeur. Vous y trouverez Méthodes connexes s'il est pris en charge au moment de l'exécution, à savoir Pour DrawableLeft

0 votes

Où dois-je placer la table de dessin dans cette méthode ?

1 votes

+1 Cela fonctionne pour définir Android:drawableLeft pour TextView de manière programmatique. Merci, mon ami.

43 votes

+1 pour l'ajout de l'astuce. Cela devrait être la toute première chose que l'on dit aux développeurs lorsqu'ils utilisent la documentation.

16voto

Jack Points 5682

De ici Je vois la méthode setCompoundDrawablesWithIntrinsicBounds(int,int,int,int,int) peut être utilisé pour ce faire.

13voto

Gibolt Points 4072

Utilisation de Kotlin :

Vous pouvez créer une fonction d'extension ou simplement utiliser setCompoundDrawablesWithIntrinsicBounds directement.

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
   this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

Si vous avez besoin de redimensionner le dessinable, vous pouvez utiliser cette fonction d'extension.

textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

Pour être vraiment fantaisiste, créez une enveloppe qui permet de modifier la taille et/ou la couleur.

textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
    val drawable = drawable(id)
    if (sizeRes != 0) {
        val size = resources.getDimensionPixelSize(sizeRes)
        drawable?.setBounds(0, 0, size, size)
    }
    if (color != 0) {
        drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    } else if (colorRes != 0) {
        val colorInt = ContextCompat.getColor(context, colorRes)
        drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
    }
    this.setCompoundDrawables(drawable, null, null, null)
}

8voto

Shajeel Afzal Points 858

Vous pouvez utiliser l'une des méthodes suivantes pour définir le Drawable sur le TextView :

1- setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)

2- setCompoundDrawables(Left_Drawable, Top_Drawable, Right_Drawable, Bottom_Drawable)

Et pour obtenir des ressources que vous pouvez utiliser :

getResources().getDrawable(R.drawable.your_drawable_id);

0 votes

Non, setCompoundDrawablesWithIntrinsicBounds(int, int, int, int) est l'API Levet 3 de votre propre lien...

1voto

r3dm4n Points 584

Une extension Kotlin + un peu de remplissage autour de l'objet à dessiner

fun TextView.addDrawable(drawable: Int) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}

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