Définir par programme le dessin à gauche dans un TextView


285

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 en xml.

Je voudrais changer le drawable dans le code.

Y a-t-il une façon de procéder? Ou définir le drawableLeft dans le code pour la vue texte?

Réponses:


781

Vous pouvez utiliser setCompoundDrawablesWithIntrinsicBounds (int gauche, int haut, int droite, int bas)

mettre 0 où vous ne voulez pas d'images

Exemple pour Drawable sur la gauche:

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

Astuce: chaque fois que vous connaissez un attribut XML mais que vous ne savez pas comment l'utiliser à l'exécution. allez simplement à la description de cette propriété dans le doc du développeur. Vous y trouverez des méthodes connexes si elles sont prises en charge lors de l'exécution. c'est-à-dire pour DrawableLeft


Alors, où dois-je définir le dessinable dans cette méthode?
coder_For_Life22

1
+1 Cela fonctionne pour configurer Android: drawableLeft pour TextView par programme. Thanx mate
Paresh Mayani

35
+1 pour l'ajout de l'astuce. cela devrait être la toute première chose que les développeurs apprennent lors de l'utilisation des documents
gmjordan

@BrainCrash Vous avez raison, je l'ai confondu avec la nouvelle méthode qui porte le même nom.
deathemperor

2
Bonjour, j'utilisais cette méthode pour définir les drawables, mais je n'ai pas pu trouver son homologue getter. Je devais vérifier si la vue textuelle composée avait un dessin. Comment je fais ça? Essayé de comparer textview.getCompoundDrawablesRelative()[0]avecmContext.getResources().getDrawable(R.drawable.my_drawable)
ravi


6

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

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

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

Et pour tirer parti des ressources, vous pouvez utiliser:

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

Non, setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) est API Levet 3 à partir de votre propre lien ...
BrainCrash

1

Utilisation de Kotlin:

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

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

Si vous devez 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 obtenir vraiment de la fantaisie, créez un emballage qui permet la modification de la taille et / ou de 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)
}

0

Une extension Kotlin + un rembourrage autour du tirable

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

0

il y a deux façons de le faire, vous pouvez utiliser XML ou Java pour cela. S'il est statique et ne nécessite aucune modification, vous pouvez l'initialiser en XML.

  android:drawableLeft="@drawable/cloud_up"
    android:drawablePadding="5sp"

Maintenant, si vous devez changer les icônes dynamiquement, vous pouvez le faire en appelant les icônes en fonction des événements

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);

-8
static private Drawable **scaleDrawable**(Drawable drawable, int width, int height) {

    int wi = drawable.getIntrinsicWidth();
    int hi = drawable.getIntrinsicHeight();
    int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
    float scale = (dimDiff > 0) ? width / (float)wi : height /
            (float)hi;
    Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
    drawable.setBounds(bounds);
    return drawable;
}

Cela ne répond pas à la question. Une réponse liée à TextView est attendue.
Rick
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.