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

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


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ć.


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


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);

To jest przestarzałe.
Taslim Oseni

2

Spróbuj tego:

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

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));
}

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.


1

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

btn.setImageResource(R.drawable.ic_XXX)

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.