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?

User7723337
quelle

Antworten:

566

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

Drawable myIcon = getResources().getDrawable( R.drawable.icon );
Jems
quelle
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);
Daniel Kilinskas
quelle
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);
}
Chris Stillwell
quelle
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.

Sameer Khanal
quelle
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.

Dhaval Patel
quelle
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.

Außergewöhnlich
quelle
1

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

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

vorwerg-ni
quelle