Come creare Drawable dalla risorsa


283

Ho un'immagine res/drawable/test.png(R.drawable.test).
Voglio passare questa immagine a una funzione che accetta Drawable, ad es mButton.setCompoundDrawables().

Quindi, come posso convertire una risorsa immagine in un Drawable?

Risposte:


567

La tua attività dovrebbe avere il metodo getResources. Fare:

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

2
Se ti capita di volerlo al di fuori di una classe Activity, dovrai trovare un altro modo per raggiungere il contesto in cui vive getResources (); questa risposta raccomanda di passarlo al costruttore
Rymo

50
A partire dalla versione 21 dell'API questo metodo è obsoleto e dovresti essere sostituito da: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren,

3
@Boren è lo stesso di usare ContextCompat.getDrawable (this, R.drawable.icon) ;?
Zach,

2
Nessuno dei suggerimenti sopra sembra funzionare se R.drawable.icon è un disegno vettoriale.
FractalBob,

4
NON UTILIZZARE QUESTO SE STAI UTILIZZANDO IL VETTORE DISEGNABILE. Utilizzare invece AppCompatResources.getDrawable (context, R.drawable.icon).
Dhaval Patel

136

Questo codice è obsoleto:

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

Usa questo invece:

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

11
Essere consapevoli del fatto che questo applicherà il tema dal contesto dato. Se si desidera assicurarsi che non venga utilizzato alcun tema, è possibile utilizzare ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(dove il terzo parametro è un'istanza del tema opzionale).
vaughandroid

23

Il getDrawable (int id) metodo è ammortizzato a partire dall'API 22.

Invece dovresti usare il getDrawable (int id, Resources.Theme theme) API 21+

Il codice sarebbe simile a questo.

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

perché non passare null per ogni api? Inoltre: sei sicuro che null sia l'opzione migliore?
jonathanrz,

1
Il getDrawable (int id, tema Resources.Theme) non è stato realizzato fino all'API 21.
Chris Stillwell,

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

13

Vorrei solo aggiungere che se stai ricevendo un messaggio "deprecato" quando usi getDrawable (...) dovresti invece usare il seguente metodo dalla libreria di supporto.

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

Non è necessario utilizzare getResources () quando si utilizza questo metodo.

Ciò equivale a fare qualcosa di simile

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

Funziona su entrambe le versioni pre e post Lollipop.


4

Ottieni Drawable dalla risorsa vettoriale indipendentemente dal suo vettore:

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

Nota:
ContextCompat.getDrawable(context, R.drawable.icon); produrrà android.content.res.Resources$NotFoundExceptionper risorsa vettoriale.


3

Se stai cercando di ottenere il disegno dalla vista in cui è impostata l'immagine come,

ivshowing.setBackgroundResource(R.drawable.one);

quindi il drawable restituirà solo un valore null con il seguente codice ...

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

Quindi, è meglio impostare l'immagine con il seguente codice, se si desidera recuperare il disegno da una vista particolare.

 ivshowing.setImageResource(R.drawable.one);

solo allora il disegno sarà convertito esattamente.


1

Se stai ereditando da un frammento puoi fare:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.