Wie erhält man ein Drawable-Objekt aus einer Ressourcen-ID im Android-Paket?

156

Ich benötige ein zeichnbares Objekt, um es auf einer Bildschaltfläche anzuzeigen. Gibt es eine Möglichkeit, den folgenden Code (oder etwas Ähnliches) zu verwenden, um ein Objekt aus dem android.R.drawable. * -Paket abzurufen?

Zum Beispiel, wenn drawableId android.R.drawable.ic_delete war

mContext.getResources().getDrawable(drawableId)
Blaskovicz
quelle

Antworten:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
quelle
Ich fand auch, dass die Verwendung des Anwendungskontexts zu funktionieren scheint, danke.
Blaskovicz
20
Ab API 22. getDrawable(int id)ist veraltet. Verwenden Sie getDrawable(int id, Resources.Theme theme)stattdessen. Die Methode getTheme()sollte hilfreich sein.
Isaac Zais
1
Ich habe einen kleinen Zweifel. In diesem Code "Die Methode getDrawable (int) vom Typ Resources ist veraltet". Nach einer SO-Antwort 1. Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden? Aus der Definition von veraltet: "Ein mit @Deprecated kommentiertes Programmelement wird von Programmierern nicht verwendet, normalerweise weil es gefährlich ist oder weil es eine bessere Alternative gibt." Was ist eine bessere Alternative dafür.
Killer
107

Wie der API 21 , sollten Sie die Verwendung getDrawable(int, Theme)Methode statt getDrawable(int), da es einen holen erlaubt drawableObjekts mit einem bestimmten zugeordnet resource IDfür die gegebenen screen density/theme. Das Aufrufen der deprecated getDrawable(int)Methode entspricht dem Aufrufen getDrawable(int, null).

Sie sollten stattdessen den folgenden Code aus der Support-Bibliothek verwenden:

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

Die Verwendung dieser Methode entspricht dem Aufruf von:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
quelle
context.getDrawable(id);scheint äquivalent zu seinresources.getDrawable(id, context.getTheme());
ErickBergmann
Dies kann in einer Zeile erfolgen, wenn Sie die Support-Bibliothek haben:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

Ab API 21 können Sie auch Folgendes verwenden:

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

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

Zain
quelle
2
Könnten Sie bitte weitere Erklärungen für die Wahl geben
Nyandika
3

Der beste Weg ist

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

ODER dies für Drawable left und so etwas für Right etc.

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

und

getResources().getDrawable() ist jetzt veraltet

Inzimam Tariq IT
quelle
0

Ab API 21 getDrawable(int id)ist veraltet. Also jetzt müssen Sie verwenden

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

Der beste Weg ist jedoch: Sie sollten eine gemeinsame Klasse erstellen, um Zeichen und Farben zu erhalten, denn wenn sich in Zukunft etwas ändert oder veraltet, müssen Sie sich nicht überall in Ihrem Projekt ändern. Sie ändern nur diese Methode

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

Verwenden Sie diese Methode wie folgt:

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

Nach einer Lösung für Kotlin-Programmierer (ab API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Jens van de Mötter
quelle