Android: alternatywa dla context.getDrawable ()

84

context.getDrawable()W moim projekcie użyłem w ten sposób:

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

Ale Eclipse daje mi błąd, który wymaga pliku Minimum API level of 21. Oznaczałoby to, że po szybkim wyszukiwaniu w Google moja aplikacja będzie dostępna tylko w Android 5.0. Ponieważ nie wszystkie urządzenia używają tej wersji Androida, chciałbym mieć alternatywę dla context.getDrawable().

Bram
źródło

Odpowiedzi:

201

Poprzednio zaakceptowana metoda została wycofana, zgodnie z dokumentacją SDK 22:

W wersjach wcześniejszych niż android.os.Build.VERSION_CODES # JELLY_BEAN ta funkcja nie pobierała poprawnie ostatecznej gęstości konfiguracji, gdy przekazany tutaj identyfikator zasobu jest aliasem do innego zasobu do rysowania. Oznacza to, że jeśli konfiguracja gęstości zasobu aliasu różni się od rzeczywistego zasobu, gęstość zwróconego elementu Drawable byłaby nieprawidłowa, co skutkowałoby złym skalowaniem.

Jak wskazano w tej odpowiedzi, lepszym rozwiązaniem byłoby użycie ContextCompat : ContextCompat.getDrawable(context, R.drawable.***)

user2417480
źródło
1
Przyjąłem tę odpowiedź teraz, ponieważ jest bardziej odpowiednia :)
Bram
26

Spróbuj dodać getResources()po kontekście, więc tak:

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

powinno działać.

glm9637
źródło
4
Resources.getDrawable został wycofany na korzyść Context.getDrawable
Joe Bowbeer
12

Miałem taką samą sytuację, w której chciałem odwołać się do metody getDrawable (), która jest obecnie przestarzała.

czego użyłem,

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

Mam nadzieję, że to ci pomoże

Umanda
źródło
9

Miałem wcześniej podobny problem. Czy próbowałeś to zrobić w ten sposób?

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

źródło
To jest przestarzałe.
Taslim Oseni
2

Spróbuj tego:

AppCompatResources.getDrawable(context, R.drawable.*)
Nando
źródło
1

Powinieneś użyć "getDrawable (id, this.getTheme ())". Ta metoda nie jest do tej pory przestarzała.

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
źródło
1

Zgadzam się na użycie ContextCompact.getDrawable (kontekst kontekstowy, int resID). U mnie zadziałało, a moja aplikacja jest przeznaczona dla interfejsu API 19.

Kaylen Travis Pillay
źródło
1

Możesz również ustawić zasób bezpośrednio, bez pracy z rysunkiem (Kotlin):

btn.setImageResource(R.drawable.ic_XXX)
Lukas Mohs
źródło
1

Rozwiązanie dla programistów Kotlin wygląda następująco:

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

lub (z API 22)

val greenProgressbar = ContextCompat.getDrawable(R.drawable.custom_progressbargreen)
Jens van de Mötter
źródło