¿Cómo se obtiene un objeto Drawable de una identificación de recurso en el paquete de Android?

156

Necesito obtener un objeto Drawable para mostrar en un botón de imagen. ¿Hay alguna manera de usar el código a continuación (o algo así) para obtener un objeto del paquete android.R.drawable. *?

por ejemplo, si drawableId fuera android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
fuente

Respuestas:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
fuente
También descubrí que usar el contexto de la aplicación parece funcionar, gracias.
Blaskovicz
20
A partir de la API 22. getDrawable(int id)está en desuso. Usar en su getDrawable(int id, Resources.Theme theme)lugar. El método getTheme()debería ser útil.
Isaac Zais
1
Tengo una pequeña duda. En este código "El método getDrawable (int) del tipo Recursos está en desuso". Según una respuesta SO 1. ¿Es incorrecto usar métodos o clases obsoletos en Java? Según la definición de obsoleto: "Un elemento de programa anotado @Deprecated es uno que se desalienta a los programadores a usar, generalmente porque es peligroso o porque existe una mejor alternativa". ¿Cuál es la mejor alternativa para esto?
Asesino
107

A partir de API 21 , debe usar el getDrawable(int, Theme)método en lugar de getDrawable(int), ya que le permite buscar un drawableobjeto asociado con un particular resource IDpara el dado screen density/theme. Llamar al deprecated getDrawable(int)método es equivalente a llamar getDrawable(int, null).

En su lugar, debe usar el siguiente código de la biblioteca de soporte:

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

Usar este método es equivalente a llamar:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
fuente
context.getDrawable(id);parece ser equivalente aresources.getDrawable(id, context.getTheme());
ErickBergmann
Esto se puede hacer en una línea si tiene la biblioteca de soporte:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

A partir de API 21, también puede usar:

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

En vez de ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Zain
fuente
2
¿Podría dar más explicaciones para la elección
Nyandika
3

la mejor manera es

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

O esto para Drawable left y algo así para right etc.

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

y

getResources().getDrawable() ahora está en desuso

Inzimam Tariq IT
fuente
0

Desde API 21 getDrawable(int id)está en desuso. Así que ahora necesitas usar

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

Pero la mejor manera de hacerlo es: debe crear una clase común para obtener dibujables y colores porque si algo cambia o se desvaloriza en el futuro, entonces no necesita cambiar en todas partes en su proyecto. Simplemente cambie en este método

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

usa este método como:

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

Seguir una solución para los programadores de Kotlin (de API 22)

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