Come si ottiene un oggetto Drawable da un ID risorsa nel pacchetto Android?


156

Devo ottenere un oggetto Drawable da visualizzare su un pulsante immagine. C'è un modo per usare il codice qui sotto (o qualcosa del genere) per ottenere un oggetto dal pacchetto android.R.drawable. *?

ad esempio se drawableId era android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)

Risposte:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

Ho anche scoperto che l'utilizzo del contesto dell'applicazione sembra funzionare, grazie.
Blaskovicz,

20
A partire dall'API 22. getDrawable(int id)è obsoleto. Usa getDrawable(int id, Resources.Theme theme)invece. Il metodo getTheme()dovrebbe essere utile.
Isaac Zais,

1
Ho un piccolo dubbio. In questo codice "Il metodo getDrawable (int) dal tipo Risorse è obsoleto". Secondo una risposta SO 1. È sbagliato utilizzare metodi o classi obsoleti in Java? Dalla definizione di deprecato: "Un elemento di programma annotato @Deprecated è uno che i programmatori sono scoraggiati dall'utilizzare, in genere perché è pericoloso o perché esiste un'alternativa migliore." Qual è la migliore alternativa per questo.
Killer il

107

A partire da API 21 , è necessario utilizzare il getDrawable(int, Theme)metodo anziché getDrawable(int), poiché consente di recuperare un drawableoggetto associato a un particolare resource IDper il dato screen density/theme. Chiamare il deprecated getDrawable(int)metodo equivale a chiamare getDrawable(int, null).

Dovresti invece usare il seguente codice dalla libreria di supporto:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

L'uso di questo metodo equivale a chiamare:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

context.getDrawable(id);sembra essere equivalente aresources.getDrawable(id, context.getTheme());
ErickBergmann

Questo può essere fatto in una riga se hai la libreria di supporto:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

A partire da API 21, puoi anche utilizzare:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Invece di ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
La prego di fornire ulteriori spiegazioni per la scelta
Nyandika,

3

il modo migliore è

 button.setBackgroundResource(android.R.drawable.ic_delete);

O questo per Drawable left e qualcosa di simile per right ecc.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

e

getResources().getDrawable() è ora obsoleto


0

Dall'API 21 getDrawable(int id)è obsoleto. Quindi ora devi usare

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Ma il modo migliore per farlo è: dovresti creare una classe comune per ottenere disegni e colori perché se qualcosa cambia o si depreca in futuro, non è necessario cambiare ovunque nel progetto. Devi solo cambiare in questo metodo

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

usa questo metodo come:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

0

A seguito di una soluzione per programmatori Kotlin (dall'API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
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.