So erstellen Sie Drawable aus einer Ressource


283

Ich habe ein Bild res/drawable/test.png(R.drawable.test).
Ich möchte dieses Bild an eine Funktion übergeben, die Drawablez mButton.setCompoundDrawables().

Wie kann ich eine Bildressource in eine konvertieren Drawable?

Antworten:


566

Ihre Aktivität sollte die Methode getResources haben. Machen:

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

2
Wenn Sie dies außerhalb einer Aktivitätsklasse wünschen, müssen Sie einen anderen Weg finden, um den Kontext zu erreichen, in dem getResources () lebt. Diese Antwort empfiehlt die Übergabe an den Konstruktor
Rymo

50
Ab API-Version 21 ist diese Methode veraltet und sollte ersetzt werden durch: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren

3
@Boren ist es dasselbe wie ContextCompat.getDrawable (this, R.drawable.icon) zu verwenden?
Zach

2
Keiner der oben genannten Vorschläge scheint zu funktionieren, wenn R.drawable.icon ein Vektor-Drawable ist.
FractalBob

4
VERWENDEN SIE DIES NICHT, WENN SIE VECTOR DRAWABLE VERWENDEN. Verwenden Sie stattdessen AppCompatResources.getDrawable (Kontext, R.drawable.icon).
Dhaval Patel

136

Dieser Code ist veraltet:

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

Verwenden Sie stattdessen Folgendes:

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

11
Beachten Sie, dass dies das Thema aus dem angegebenen Kontext anwendet. Wenn Sie sicherstellen möchten, dass kein Thema verwendet wird, können Sie es verwenden ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(wobei der 3. Parameter eine optionale Themeninstanz ist).
Vaughandroid

23

Die getDrawable (int id)Methode wird ab API 22 abgeschrieben.

Verwenden Sie stattdessen die getDrawable (int id, Resources.Theme theme)for API 21+

Code würde ungefähr so ​​aussehen.

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

Warum nicht für jede API null übergeben? Plus: Sind Sie sicher, dass null die beste Option ist?
Jonathanrz

1
Das getDrawable (int id, Resources.Theme-Thema) kam erst mit API 21 zustande.
Chris Stillwell

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

13

Ich möchte nur hinzufügen, dass Sie stattdessen die folgende Methode aus der Support-Bibliothek verwenden sollten, wenn Sie bei Verwendung von getDrawable (...) eine "veraltete" Nachricht erhalten.

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

Sie müssen getResources () nicht verwenden, wenn Sie diese Methode verwenden.

Dies ist gleichbedeutend mit so etwas wie

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

Dies funktioniert sowohl vor als auch nach Lollipop.


4

Holen Sie sich Drawable aus der Vektorressource, unabhängig davon, ob es sich um einen Vektor handelt oder nicht:

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

Hinweis:
ContextCompat.getDrawable(context, R.drawable.icon); Wird android.content.res.Resources$NotFoundExceptionfür die Vektorressource erzeugt.


3

Wenn Sie versuchen, das Zeichenobjekt aus der Ansicht zu erhalten, in der das Bild festgelegt ist,

ivshowing.setBackgroundResource(R.drawable.one);

dann gibt das Drawable nur den Nullwert mit dem folgenden Code zurück ...

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

Es ist daher besser, das Bild mit dem folgenden Code festzulegen, wenn Sie das Zeichen aus einer bestimmten Ansicht abrufen möchten.

 ivshowing.setImageResource(R.drawable.one);

Nur dann werden wir das Drawable genau konvertieren.


1

Wenn Sie von einem Fragment erben, können Sie Folgendes tun:

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

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.