Comment obtenir un objet Drawable à partir d'un identifiant de ressource dans un package Android?

156

J'ai besoin d'un objet Drawable à afficher sur un bouton d'image. Existe-t-il un moyen d'utiliser le code ci-dessous (ou quelque chose du genre) pour obtenir un objet du package android.R.drawable. *?

par exemple si drawableId était android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
la source

Réponses:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
la source
J'ai également trouvé que l'utilisation du contexte de l'application semble fonctionner, merci.
Blaskovicz
20
Depuis l'API 22. getDrawable(int id)est obsolète. Utilisez getDrawable(int id, Resources.Theme theme)plutôt. La méthode getTheme()devrait être utile.
Isaac Zais
1
J'ai un petit doute. Dans ce code "La méthode getDrawable (int) du type Resources est obsolète". Selon une réponse de SO 1. Est-il erroné d'utiliser des méthodes ou des classes obsolètes en Java? D'après la définition de obsolète: "Un élément de programme annoté @Deprecated est un élément que les programmeurs sont découragés d'utiliser, généralement parce qu'il est dangereux ou parce qu'il existe une meilleure alternative." Quelle est la meilleure alternative pour cela.
Killer
107

À partir de l' API 21 , vous devez utiliser la getDrawable(int, Theme)méthode au lieu de getDrawable(int), car elle vous permet de récupérer un drawableobjet associé à un particulier resource IDpour le donné screen density/theme. Appeler la deprecated getDrawable(int)méthode équivaut à appeler getDrawable(int, null).

Vous devez utiliser le code suivant de la bibliothèque de support à la place:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Utiliser cette méthode équivaut à appeler:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
la source
context.getDrawable(id);semble être équivalent àresources.getDrawable(id, context.getTheme());
ErickBergmann
Cela peut être fait en une seule ligne si vous avez la bibliothèque de support:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

À partir de l'API 21, vous pouvez également utiliser:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Au lieu de ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Zain
la source
2
Pourriez-vous s'il vous plaît fournir plus d'explications sur le choix
Nyandika
3

le meilleur moyen est

 button.setBackgroundResource(android.R.drawable.ic_delete);

OU ceci pour Drawable left et quelque chose comme ça pour droite etc.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

et

getResources().getDrawable() est désormais obsolète

Inzimam Tariq IT
la source
0

From API 21 getDrawable(int id)est obsolète. Alors maintenant, vous devez utiliser

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Mais la meilleure façon de faire est de créer une classe commune pour obtenir des dessins et des couleurs, car si quelque chose change ou devient obsolète à l'avenir, vous n'avez pas besoin de changer partout dans votre projet.

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

utilisez cette méthode comme:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);
Sanjayrajsinh
la source
0

Suite à une solution pour les programmeurs Kotlin (à partir de l'API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Jens van de Mötter
la source