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)

Réponses:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

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

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)


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


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

0

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
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.