373 votes

L'appel à setCompoundDrawables() n'affiche pas le Drawable composé.

Après avoir appelé le setCompoundDrawables méthode, le composé Drawable n'est pas montré

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

Des idées ?

12 votes

Comme indiqué dans les réponses ci-dessous, la variante de la méthode nommée (..)WithIntrinsicBounds doit être appelé. A propos, padding pour le Drawable composé doit être défini après cet appel pour provoquer un effet

8 votes

Le site documento dit : Les Drawables doivent déjà avoir setBounds(Rect) appelé.

0 votes

Bonjour Hunterp, je viens de vous rencontrer au café (Angel), maintenant que je sais que vous savez ce que sont les Drawables d'Android (et que vous avez peut-être rencontré des erreurs de mémoire en travaillant avec beaucoup d'entre eux), je peux vous parler de certains des projets auxquels j'ai collaboré pour traiter ce problème. github.com/JakeWharton/DiskLruCache (que j'ai collaboré à rendre plus convivial pour Android) qui est utilisé par Picasso ( github.com/square/picasso )

704voto

hunterp Points 3901

J'avais besoin d'utiliser setCompoundDrawablesWithIntrinsicBounds .

7 votes

A besoin de l'api 17, donc Drawable.setBounds() pourrait être meilleur

9 votes

Merci beaucoup cela fonctionne pour moi puis-je savoir quelle est la différence entre ces deux ?

1 votes

@user1324936 La version 'relative' requiert l'API 17, les autres peuvent être utilisées avec les versions précédentes.

76voto

aryan bahmani Points 20

Utilisez ceci (j'ai testé). Il fonctionne 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 votes

Ceci est utile lorsque l'on cible des API inférieures à 17, car EditText#setCompoundDrawablesWithIntrinsicBounds nécessite au moins l'API 17.

6 votes

Pouvez-vous fournir une source à ce sujet ? Toute la documentation que j'ai vue indique que cela a été disponible depuis l'API 1 .

52voto

teoREtik Points 2501

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

1 votes

Meilleure réponse parce que vous fournissez le raisonnement qui explique pourquoi setBounds est important.

0 votes

@Andy Exactement, je déteste ces réponses avec 800 votes qui ne font que copier-coller une ligne de code sans aucun mot.

48voto

ruan65 Points 402

Exemple en haut de page :

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

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

24voto

Alecs Points 21

Un peu plus simple encore :

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, 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