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?

Usuario7723337
fuente

Respuestas:

567

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

Drawable myIcon = getResources().getDrawable( R.drawable.icon );
Jems
fuente
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);
daniel kilinskas
fuente
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);
}
Chris Stillwell
fuente
¿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.

Sameer Khanal
fuente
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.

Dhaval Patel
fuente
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.

Excepcional
fuente
1

Si está heredando de un fragmento, puede hacer:

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

vorwerg-ni
fuente