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)

Antworten:


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

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

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)


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


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

0

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.