2011-01-27 9 views
228

Tengo una imagen res/drawable/test.png (R.drawable.test).
Quiero pasar esta imagen a una función que acepta Drawable.
(por ejemplo mButton.setCompoundDrawables())Cómo crear Drawable desde el recurso

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

Respuesta

492

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

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

¿Necesita agregar algo más al manifiesto, por ejemplo? Creé un proyecto vacío con solo esta línea de código en onCreate y obtengo Resources $ NotFoundException. El proyecto vino con icon.png en hdpi, ldpi y mdpi map. – Vincent

+1

Si le interesa esto fuera de una clase de actividad, deberá encontrar otra forma de llegar al contexto donde vive getResources(); [esta respuesta recomienda pasarlo al constructor] (http://stackoverflow.com/a/6214567/404960) – rymo

+34

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(), página.getImageId(), null); – Boren

0

Si usted está tratando de obtener el dibujable desde el punto de vista donde la imagen se establece como,

ivshowing.setBackgroundResource(R.drawable.one); 

entonces el dibujable volverá nulo valor sólo con el siguiente código ...

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

Por lo tanto, es mejor establecer 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.

20

El método getDrawable (int id) se amortiza a partir del API 22.

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

código sería algo como esto.

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

¿por qué no pasar el nulo para cada api? Además: ¿Estás seguro de que la opción nula es la mejor? – jonathanrz

+1

El getDrawable (int id, tema Resources.Theme) no apareció hasta API 21. – ChrisStillwell

98

Este código está en desuso.

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

Utilice esta instad.

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

Tenga en cuenta que esto aplicará el tema del contexto dado. Si desea asegurarse de que no se utiliza ningún tema, puede usar 'ResourcesCompat.getDrawable (getResources(), R.drawable.icon, null);' (donde el 3er parámetro es una instancia opcional de Theme). – vaughandroid

9

me gustaría añadir que si usted está consiguiendo "en desuso" mensaje cuando se utiliza getDrawable (...) se debe utilizar el siguiente método de la biblioteca de soporte en su lugar.

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

No es necesario utilizar getResources() al usar 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 ambas versiones pre y post piruleta.

Cuestiones relacionadas