Cómo crear Drawable a partir de recursos


283

Tengo una imagen res/drawable/test.png(R.drawable.test).
Quiero pasar esta imagen a una función que acepte Drawable, por ejemplo mButton.setCompoundDrawables().

Entonces, ¿cómo puedo convertir un recurso de imagen en a Drawable?

Respuestas:


567

Su actividad debe tener el método getResources. Hacer:

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

2
Si quiere esto fuera de una clase de Actividad, tendrá que encontrar otra forma de llegar al Contexto donde vive getResources (); esta respuesta recomienda pasarlo al constructor
rymo

50
A partir de la versión 21 de la API, este método está en desuso y debe ser reemplazado por: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren

3
@Boren, ¿es lo mismo que usar ContextCompat.getDrawable (esto, R.drawable.icon) ;?
Zach

2
Ninguna de las sugerencias anteriores parece funcionar si R.drawable.icon es un Vector dibujable.
FractalBob

44
NO UTILICE ESTO SI UTILIZA EL VECTOR DIBUJABLE. Utilice AppCompatResources.getDrawable (context, R.drawable.icon) en su lugar.
Dhaval Patel el

136

Este código está en desuso:

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

Use esto en su lugar:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
Tenga en cuenta que esto aplicará el tema desde el contexto dado. Si desea asegurarse de que no se use ningún tema, puede usarlo ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(donde el tercer parámetro es una instancia de Tema opcional).
vaughandroid

23

El getDrawable (int id)método se deprecia a partir de la API 22.

En su lugar, debe usar la getDrawable (int id, Resources.Theme theme)API 21+

El código se vería así.

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

¿Por qué no pasar nulo para cada API? Además: ¿Estás seguro de que nulo es la mejor opción?
jonathanrz

1
El getDrawable (int id, Resources.Theme theme) no apareció hasta API 21.
Chris Stillwell

ogetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone el

13

Solo me gustaría agregar que si recibe un mensaje "obsoleto" cuando usa getDrawable (...), debe usar el siguiente método de la biblioteca de soporte.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

No tiene que usar getResources () cuando usa este método.

Esto es equivalente a hacer algo como

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

Esto funciona en versiones anteriores y posteriores a Lollipop.


4

Obtenga Drawable de un recurso vectorial independientemente de si es vector o no:

AppCompatResources.getDrawable(context, R.drawable.icon);

Nota:
ContextCompat.getDrawable(context, R.drawable.icon); producirá android.content.res.Resources$NotFoundExceptionpara el recurso vectorial.


3

Si está intentando obtener el dibujable desde la vista donde se establece la imagen como,

ivshowing.setBackgroundResource(R.drawable.one);

entonces el sorteo devolverá solo un valor nulo con el siguiente código ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Por lo tanto, es mejor configurar la imagen con el siguiente código, si desea recuperar el dibujo de una vista en particular.

 ivshowing.setImageResource(R.drawable.one);

solo entonces el dibujable convertiremos exactamente.


1

Si está heredando de un fragmento, puede hacer:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.