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?

Réponses:


567

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

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

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

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

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.


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.


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.


1

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

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

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.