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?


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.


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 );

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


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)


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 );

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);

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)

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)

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.

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.