Android: Alternative für context.getDrawable ()


84

Ich habe context.getDrawable()so in meinem Projekt verwendet:

Drawable greenProgressbar = context.getDrawable(R.drawable.custom_progressbargreen);

Aber Eclipse gibt mir einen Fehler, dass es einen braucht Minimum API level of 21. Dies würde bedeuten, dass meine APP nach einer schnellen Google-Suche nur noch verwendet werden kann Android 5.0. Da nicht alle Geräte diese Android-Version verwenden, hätte ich gerne eine Alternative für context.getDrawable().

Antworten:


200

Die zuvor akzeptierte Methode ist gemäß der SDK 22-Dokumentation veraltet:

Vor android.os.Build.VERSION_CODES # JELLY_BEAN hat diese Funktion die endgültige Konfigurationsdichte nicht korrekt abgerufen, wenn die hier übergebene Ressourcen-ID ein Alias ​​für eine andere Drawable-Ressource ist. Dies bedeutet, dass wenn sich die Dichtekonfiguration der Alias-Ressource von der tatsächlichen Ressource unterscheidet, die Dichte des zurückgegebenen Drawable falsch ist, was zu einer schlechten Skalierung führt.

Wie in dieser Antwort ausgeführt , wäre die Verwendung von ContextCompat eine bessere Lösung : ContextCompat.getDrawable(context, R.drawable.***)


1
Ich habe diese Antwort jetzt akzeptiert, da sie relevanter ist :)
Bram

26

Versuchen Sie, ein getResources()nach dem Kontext hinzuzufügen , also Folgendes:

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

sollte arbeiten.


4
Resources.getDrawable wurde zugunsten von Context.getDrawable
Joe Bowbeer

12

Ich hatte dieselbe Situation, auf die ich die Methode getDrawable () verweisen wollte, die jetzt veraltet ist.

was ich benutzt habe,

myButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_btn_off));

Hoffe das wird dir helfen


9

Ich hatte vorher ein ähnliches Problem. Haben Sie versucht, es so zu machen?

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

Dies ist veraltet.
Taslim Oseni

2

Versuche dies:

AppCompatResources.getDrawable(context, R.drawable.*)

1

Sie sollten "getDrawable (id, this.getTheme ())" verwenden. Diese Methode ist bisher nicht veraltet.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    view.setBackground(getResources().getDrawable(R.drawable.radioline,this.getTheme()));
} else {
   view.setBackground(getResources().getDrawable(R.drawable.radioline));
}

1

Ich bin damit einverstanden, ContextCompact.getDrawable (Kontextkontext, int resID) zu verwenden. Es hat bei mir funktioniert und meine App zielt auf API 19 ab.


1

Sie können die Ressource auch direkt festlegen, ohne mit dem Drawable (Kotlin) zu arbeiten:

btn.setImageResource(R.drawable.ic_XXX)

1

Die Lösung für Kotlin-Programmierer sieht folgendermaßen aus:

val greenProgressbar = context!!.getDrawable(R.drawable.custom_progressbargreen)

oder (ab API 22)

val greenProgressbar = ContextCompat.getDrawable(R.drawable.custom_progressbargreen)
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.