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.