Comment créer Drawable à partir d'une ressource

283

J'ai une image res/drawable/test.png(R.drawable.test).
Je veux passer cette image à une fonction qui accepte Drawable, par exemple mButton.setCompoundDrawables().

Alors, comment puis-je convertir une ressource d'image en un Drawable?

User7723337
la source

Réponses:

567

Votre activité doit avoir la méthode getResources. Faire:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );
Jems
la source
2
Si vous le souhaitez en dehors d'une classe d'activité, vous devrez trouver un autre moyen d'atteindre le contexte où réside getResources (); cette réponse recommande de la passer dans le constructeur
rymo
50
À partir de l'API version 21, cette méthode est obsolète et vous devez être remplacée par: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren
3
@Boren est-ce la même chose que d'utiliser ContextCompat.getDrawable (this, R.drawable.icon) ;?
Zach
2
Aucune des suggestions ci-dessus ne semble fonctionner si R.drawable.icon est un vecteur à dessiner.
FractalBob
4
N'UTILISEZ PAS CELA SI VOUS UTILISEZ VECTOR DRAWABLE. Utilisez plutôt AppCompatResources.getDrawable (context, R.drawable.icon).
Dhaval Patel
136

Ce code est obsolète:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Utilisez-le à la place:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);
daniel kilinskas
la source
11
Soyez conscient que cela appliquera le thème du contexte donné. Si vous voulez vous assurer qu'aucun thème n'est utilisé, vous pouvez l'utiliser ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(où le 3ème paramètre est une instance de thème facultative).
vaughandroid
23

La getDrawable (int id)méthode est dépréciée à partir de l'API 22.

Au lieu de cela, vous devez utiliser le getDrawable (int id, Resources.Theme theme)pour API 21+

Le code ressemblerait à quelque chose comme ça.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}
Chris Stillwell
la source
pourquoi ne pas passer null pour chaque api? De plus: êtes-vous sûr que null est la meilleure option?
jonathanrz
1
Le getDrawable (int id, Resources.Theme theme) n'est apparu qu'à partir de l'API 21.
Chris Stillwell
ougetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone
13

Je voudrais juste ajouter que si vous obtenez un message "obsolète" lors de l'utilisation de getDrawable (...), vous devez utiliser la méthode suivante à partir de la bibliothèque de support.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

Vous n'avez pas besoin d'utiliser getResources () lorsque vous utilisez cette méthode.

Cela équivaut à faire quelque chose comme

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

Cela fonctionne sur les versions pré et post Lollipop.

Sameer Khanal
la source
4

Obtenez Drawable à partir d'une ressource vectorielle indépendamment de, que ce soit son vecteur ou non:

AppCompatResources.getDrawable(context, R.drawable.icon);

Remarque:
ContextCompat.getDrawable(context, R.drawable.icon); produira android.content.res.Resources$NotFoundExceptionpour la ressource vectorielle.

Dhaval Patel
la source
3

Si vous essayez d'obtenir le dessinable de la vue où l'image est définie comme,

ivshowing.setBackgroundResource(R.drawable.one);

alors le drawable ne retournera que la valeur null avec le code suivant ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Il est donc préférable de définir l'image avec le code suivant, si vous souhaitez récupérer le dessinable à partir d'une vue particulière.

 ivshowing.setImageResource(R.drawable.one);

ce n'est qu'alors que le dessinable sera converti exactement.

Exceptionnel
la source
1

Si vous héritez d'un fragment, vous pouvez faire:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

vorwerg-ni
la source