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.