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?

coder_For_Life22
la source

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

BrainCrash
la source
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);
Shajeel Afzal
la source
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)
}
Gibolt
la source
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)
}
r3dm4n
la source
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);
Ayan Bhattacharjee
la source
-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;
}
Rashmi P
la source
Cela ne répond pas à la question. Une réponse liée à TextView est attendue.
Rick