So erstellen Sie Drawable aus einer Ressource

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer7723337

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

Wie kann ich also eine Bildressource in eine Drawable?

Benutzer-Avatar
Jems

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

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


Ab API-Version 21 ist diese Methode veraltet und kann ersetzt werden durch:

Drawable myIcon = AppCompatResources.getDrawable(context, R.drawable.icon);

Wenn Sie ein benutzerdefiniertes Design angeben müssen, wird es wie folgt angewendet, aber nur, wenn die API Version 21 oder höher ist:

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

  • Wenn Sie dies außerhalb einer Aktivitätsklasse möchten, müssen Sie einen anderen Weg finden, um den Kontext zu erreichen, in dem sich getResources() befindet. Diese Antwort empfiehlt, sie an den Konstruktor zu übergeben

    – Rymo

    30. Juni 2014 um 20:39 Uhr

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

    – Langweilig

    14. April 2015 um 23:07 Uhr


  • @Boren ist es dasselbe wie die Verwendung von ContextCompat.getDrawable (this, R.drawable.icon);?

    – Zach

    1. September 2016 um 17:57 Uhr


  • Keiner der obigen Vorschläge scheint zu funktionieren, wenn R.drawable.icon ein Vector drawable ist.

    – FractalBob

    29. Mai 2017 um 22:57 Uhr

  • VERWENDEN SIE DIES NICHT, WENN SIE VECTOR DRAWABLE VERWENDEN. Verwenden Sie stattdessen AppCompatResources.getDrawable(context, R.drawable.icon ).

    – Dhaval Patel

    3. Oktober 2018 um 4:37 Uhr

Benutzer-Avatar
Daniel Kilinskas

Dieser Code ist veraltet:

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

Verwenden Sie stattdessen Folgendes:

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

  • Beachten Sie, dass dies das Thema aus dem gegebenen Kontext anwenden wird. Wenn Sie sicherstellen möchten, dass kein Design verwendet wird, können Sie verwenden ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null); (wobei der 3. Param eine optionale Theme-Instanz ist).

    – vaughandroid

    31. März 2016 um 7:18 Uhr

Benutzer-Avatar
Chris Stillwell

Das getDrawable (int id) -Methode ist ab API 22 veraltet.

Stattdessen sollten Sie die verwenden getDrawable (int id, Resources.Theme theme) für API 21+

Code würde in etwa 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

    15. Mai 2015 um 13:20 Uhr

  • Das getDrawable(int id, Resources.Theme-Design) wurde erst mit API 21 entwickelt.

    – Chris Stillwell

    15. Mai 2015 um 14:43 Uhr

  • oder getResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)

    – Simon Federstein

    19. November 2018 um 15:48 Uhr

Benutzer-Avatar
Sameer Khanal

Ich möchte nur hinzufügen, dass Sie stattdessen die folgende Methode aus der Support-Bibliothek verwenden sollten, wenn Sie bei der Verwendung von getDrawable (…) die Meldung “veraltet” erhalten.

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

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

Dies ist gleichbedeutend mit 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 in Pre- als auch in Post-Lollipop-Versionen.

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

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

Notiz:
ContextCompat.getDrawable(context, R.drawable.icon); wird herstellen android.content.res.Resources$NotFoundException für Vektorressource.

  • Hervorragende Antwort!!

    – Jim Andreas

    18. September 2020 um 8:18 Uhr

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

ivshowing.setBackgroundResource(R.drawable.one);

dann gibt das Drawable mit dem folgenden Code nur einen Nullwert zurück …

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

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

 ivshowing.setImageResource(R.drawable.one);

erst dann wird das abziehbare genau umgerechnet.

  • Hervorragende Antwort!!

    – Jim Andreas

    18. September 2020 um 8:18 Uhr

Benutzer-Avatar
vorwerg-ni

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

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

  • Das hat bei mir funktioniert, nach dem Vorschlag von Android Studio wird es in requireActivity()!!.getDrawable(R.drawable.id) konvertiert.

    – erhun

    28. Juli 2020 um 7:36 Uhr

1013980cookie-checkSo erstellen Sie Drawable aus einer Ressource

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy