Z nowym Android API API 22 getResources().getDrawable()
jest już przestarzałe. Teraz najlepszym rozwiązaniem jest użycie tylko getDrawable()
.
Co się zmieniło?
Resources#getDrawable(int)
i Resources#getColor(int)
były przestarzałe.
Z nowym Android API API 22 getResources().getDrawable()
jest już przestarzałe. Teraz najlepszym rozwiązaniem jest użycie tylko getDrawable()
.
Co się zmieniło?
Resources#getDrawable(int)
i Resources#getColor(int)
były przestarzałe.
Odpowiedzi:
Masz kilka opcji, aby poradzić sobie z tą amortyzacją we właściwy (i przyszły ) sposób, w zależności od tego, jaki ładunek rysujesz ładujesz:
A) Drawables z atrybutami motywu
ContextCompat.getDrawable(getActivity(), R.drawable.name);
Otrzymasz styl Drawable zgodnie z instrukcją motywu aktywności. To prawdopodobnie potrzebujesz.
B) Drawable bez atrybutów motywu
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
Będziesz mógł wyciągać swój niestylowany styl po staremu. Uwaga: nieResourcesCompat.getDrawable()
jest przestarzałe!
EXTRA) drawables z atrybutami motywu z innego motywu
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Zamiast tego należy użyć następującego kodu z biblioteki wsparcia:
ContextCompat.getDrawable(context, R.drawable.***)
Użycie tej metody jest równoważne z wywołaniem:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
Począwszy od interfejsu API 21, należy getDrawable(int, Theme)
zamiast tego użyć metody getDrawable(int)
, ponieważ pozwala ona pobrać obiekt do rysowania powiązany z określonym identyfikatorem zasobu dla danej gęstości ekranu / motywu. Wywołanie przestarzałej getDrawable(int)
metody jest równoważne z wywołaniem getDrawable(int, null)
.
getDrawable (int id)
metody Context
klasy. Jest to to samo, co getResources().getDrawable(id, getTheme());
nowy interfejs API.
getDrawable(int, Resources.Theme)
.
Zamień ten wiersz:
getResources().getDrawable(R.drawable.your_drawable)
z ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
EDYTOWAĆ
ResourcesCompat
jest teraz przestarzałe. Ale możesz użyć tego:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Tutaj this
kontekst)
Aby uzyskać więcej informacji, kliknij ten link: ContextCompat
getResources().getDrawable()
był przestarzały na poziomie API 22. Teraz musimy dodać motyw:getDrawable (int id, motyw Resources.Theme) (Dodano w interfejsie API na poziomie 21)
To jest przykład:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
Oto przykład sprawdzania poprawności dla późniejszych wersji:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
} else {
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}
Build.VERSION_CODES.LOLLIPOP is API 21
, więc nie powinno to być if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
lub if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? Nieważne. Od dołu „Metoda została dodana w API 21, ale nie była przestarzała aż do API 22. :)”
Możesz użyć
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
to dla mnie praca
To tylko przykład, jak naprawiłem problem w tablicy, aby załadować listView, mam nadzieję, że to pomoże.
mItems = new ArrayList<ListViewItem>();
// Resources resources = getResources();
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));
Spróbuj tego:
public static List<ProductActivity> getCatalog(Resources res){
if(catalog == null) {
catalog.add(new Product("Dead or Alive", res
.getDrawable(R.drawable.product_salmon),
"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
catalog.add(new Product("Switch", res
.getDrawable(R.drawable.switchbook),
"Switch by Chip Heath and Dan Heath", 24.99));
catalog.add(new Product("Watchmen", res
.getDrawable(R.drawable.watchmen),
"Watchmen by Alan Moore and Dave Gibbons", 14.99));
}
}
Jeśli celujesz w SDK> 21 (Lollipop lub 5.0), użyj
context.getDrawable(R.drawable.your_drawable_name)
getDrawable (int drawable) jest nieaktualny na poziomie API 22. W celach informacyjnych patrz ten link .
Teraz, aby rozwiązać ten problem, musimy przekazać nowy konstruktor wraz z identyfikatorem, takim jak: -
getDrawable(int id, Resources.Theme theme)
Dla rozwiązań Wykonaj następujące czynności: -
W Javie: -
ContextCompat.getDrawable(getActivity(), R.drawable.name);
lub
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
W Kotlinie: -
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
lub
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
Mam nadzieję, że to ci pomoże.
en api poziom 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Dla niektórych, którzy wciąż rozwiązują ten problem, nawet po zastosowaniu sugestii tego wątku (kiedyś taki byłem), dodaj ten wiersz do klasy aplikacji, metoda onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Jak sugerowano tu i tutaj, czasami jest to wymagane, aby uzyskać dostęp do wektorów z zasobów, szczególnie gdy masz do czynienia z elementami menu itp
W Kotlin możesz użyć rozszerzenia
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
następnie użyj like
context.getMyDrawable(R.drawable.my_icon)
Build.VERSION_CODES.LOLLIPOP należy teraz zmienić na BuildVersionCodes.Lollipop, tj .:
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}
BuildVersionCodes
klasa nie jest specyficzna dla Xamarin?
getDrawable (int id)
klasyResources
jest przestarzała. Powinieneś teraz użyć metodygetDrawable (int id, Resources.Theme theme)
z nowym parametrem kompozycji.