L'appel de setCompoundDrawables () n'affiche pas le Composable Drawable

323

Après avoir appelé la setCompoundDrawablesméthode, le composé Drawable ne s'affiche pas.

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

Des pensées?

Hunterp
la source
9
Comme indiqué dans les réponses ci-dessous, la variante de la méthode nommée (..)WithIntrinsicBoundsdoit être appelée. Sur une note latérale, paddingpour le composé dessinable doit être défini après cet appel pour provoquer un effet
Dr1Ku
6
Le document dit: Les Drawables devaient déjà avoir setBounds(Rect)appelé.
salut hunterp, je viens de vous rencontrer au café (Angel), maintenant que je sais que vous savez ce que sont les Drawables Android (et peut-être que vous avez perdu la mémoire des erreurs d'erreur lorsque vous travaillez avec beaucoup d'entre eux), je peux vous parler de certains les projets que j'ai collaborés ont dû faire face à ce problème, consultez github.com/JakeWharton/DiskLruCache (que j'ai collaboré pour rendre plus convivial pour Android) qui est utilisé par Picasso ( github.com/square/picasso )
Gubatron
@ Dr1Ku En fait, je l'ai avant et ça marche quand même.
Sotti

Réponses:

629

J'avais besoin d'utiliser setCompoundDrawablesWithIntrinsicBounds.

Hunterp
la source
7
nécessite l'api 17, donc Drawable.setBounds () pourrait être mieux
user1324936
6
merci beaucoup .. cela fonctionne pour moi .. puis-je savoir quelle est la différence entre ces deux?
AndEngine
1
@ user1324936 La version "relative" nécessite l'API 17, d'autres peuvent être utilisées avec les versions précédentes
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds a été ajouté dans l' API niveau 3
Greg Ennis
J'utilisais setCompoundDrawableRelativeWithIntrinsicBounds <- celui-ci a été ajouté sur l'API 17. Attention à l'intellisense.
Neon Warge
69

Utilisez ceci (j'ai testé). Ça marche bien

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );
bahmani aryen
la source
1
Ceci est utile lorsque vous ciblez des API inférieures à 17, car EditText#setCompoundDrawablesWithIntrinsicBoundsnécessite au moins l'API 17.
Krøllebølle
6
Pouvez-vous fournir une source pour cela? Toute la documentation que j'ai vue indique que cela est disponible depuis l'API 1 .
kurifu
48

L'image est vide car elle n'a pas de limites spécifiées. Vous pouvez utiliser, setCompoundDrawables()mais avant de spécifier les limites de l'image, en utilisant la Drawable.setBounds()méthode

teoREtik
la source
1
Meilleure réponse car vous fournissez en fait le raisonnement expliquant pourquoi setBounds est important.
Andy
@Andy Exactement, déteste ces meilleures réponses avec 800 votes qui copient simplement une ligne de code collée sans aucun mot
Big_Chair
44

Exemple mis en haut:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

ordre des arguments: (gauche, haut, droite, bas)

Andrey
la source
1
ce devrait être la réponse acceptée, dans mon cas en utilisant le bouton. et cela a fonctionné comme prévu !!! Il a également une compatibilité descendante.
mochadwi
22

Encore un peu plus simple:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );
Alecs
la source
10

Il est déconseillé dans l'API 22.

Ce code m'est utile:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);
許維德
la source
3

À Kotlin:

1) Ensemble drawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

ou

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) Ensemble TextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

ou

button.setCompoundDrawables(null, drawable, null, null)
CoolMind
la source
Pour Textview setCompoundDrawablesWithIntrinsicBoundsfonctionnera ..
Akash Bisariya
1

Exemple avec Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)
mike.tihonchik
la source
0

L'image n'est pas affichée car vous n'avez pas spécifié les limites, vous avez donc 2 options ici.

1ère méthode

Utilisez la setCompoundDrawablesWithIntrinsicBoundsméthode, comme indiqué ci-dessous

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

2ème méthode

Vous pouvez appliquer des limites au dessinable avant de l'appliquer à TextView, comme illustré ci-dessous

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

C'est tout.

Asad Ali Choudhry
la source