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().

Bram
quelle

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.***)

user2417480
quelle
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.

glm9637
quelle
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

Umanda
quelle
9

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

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

quelle
Dies ist veraltet.
Taslim Oseni
2

Versuche dies:

AppCompatResources.getDrawable(context, R.drawable.*)
Nando
quelle
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));
}
Maulik Baraiya
quelle
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.

Kaylen Travis Pillay
quelle
1

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

btn.setImageResource(R.drawable.ic_XXX)
Lukas Mohs
quelle
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)
Jens van de Mötter
quelle