З новим Android 22 API getResources().getDrawable()
тепер застаріло. Зараз найкращим підходом є лише використання getDrawable()
.
Що змінилося?
Resources#getDrawable(int)
і Resources#getColor(int)
як застаріли.
З новим Android 22 API getResources().getDrawable()
тепер застаріло. Зараз найкращим підходом є лише використання getDrawable()
.
Що змінилося?
Resources#getDrawable(int)
і Resources#getColor(int)
як застаріли.
Відповіді:
У вас є кілька варіантів вирішити цю депресію правильним (і майбутнім доказом ) способом, залежно від того, який тип малювання ви завантажуєте:
А) малюнки з атрибутами теми
ContextCompat.getDrawable(getActivity(), R.drawable.name);
Ви отримаєте стилізований графічний малюнок у відповідності до теми своєї діяльності. Це, мабуть, те, що вам потрібно.
В) малюнки без атрибутів теми
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
Ви отримаєте своє неспокійне малювання старим способом. Будь ласка , зверніть увагу: ResourcesCompat.getDrawable()
це НЕ рекомендується!
EXTRA) малюнки з атрибутами теми з іншої теми
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Ви повинні використовувати наступний код із бібліотеки підтримки:
ContextCompat.getDrawable(context, R.drawable.***)
Використання цього методу еквівалентно виклику:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
Як і для API 21, ви повинні використовувати getDrawable(int, Theme)
метод замість getDrawable(int)
, оскільки він дозволяє отримати об'єкт, що виводиться, пов’язаний з певним ідентифікатором ресурсу для заданої щільності / теми екрана. Виклик застарілого getDrawable(int)
методу еквівалентний виклику getDrawable(int, null)
.
getDrawable (int id)
методу Context
класу. Це те саме, що getResources().getDrawable(id, getTheme());
також використовується новий API.
getDrawable(int, Resources.Theme)
.
Замініть цей рядок:
getResources().getDrawable(R.drawable.your_drawable)
з ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
EDIT
ResourcesCompat
зараз також застаріла. Але ви можете скористатися цим:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Ось this
контекст)
Детальніше перейдіть за цим посиланням: ContextCompat
getResources().getDrawable()
була застаріла в рівні API 22. Тепер ми повинні додати тему:getDrawable (int id, Resources.Theme тема) (Додано в рівні API 21)
Це приклад:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
Це приклад, як перевірити наступні версії:
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
, так не повинно бути if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
чи if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? Не звертай уваги. Знизу "Метод був доданий в API 21, але він не був застарілий до API 22. :)"
Можна використовувати
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
це робота для мене
Якраз приклад того, як я вирішив проблему в масиві для завантаження listView, сподіваюся, що це допоможе.
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)));
Спробуйте це:
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));
}
}
Якщо ви орієнтовані на SDK> 21 (льодяник або 5.0), використовуйте
context.getDrawable(R.drawable.your_drawable_name)
getDrawable (int drawable) застарілий у рівні API 22. Для ознайомлення див. це посилання .
Тепер для вирішення цієї проблеми нам потрібно передати новий конструктор разом з id на зразок:
getDrawable(int id, Resources.Theme theme)
Для рішень роблять так: -
На Java: -
ContextCompat.getDrawable(getActivity(), R.drawable.name);
або
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
У Котліні: -
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
або
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
Сподіваюся, це допоможе вам. Дякую.
en api рівень 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Для тих, хто все-таки отримав цю проблему для вирішення навіть після застосування пропозиції цього потоку (я раніше був подібний), додайте цей рядок у свій клас застосунку, метод onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Як запропоновано тут і тут, іноді це потрібно для доступу до векторів із ресурсів, особливо коли ви маєте справу з пунктами меню тощо
У Котліні ви можете використовувати розширення
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
то використовуйте як
context.getMyDrawable(R.drawable.my_icon)
Build.VERSION_CODES.LOLLIPOP тепер слід змінити на BuildVersionCodes.Lollipop, тобто:
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
клас специфічний для Xamarin?
getDrawable (int id)
класуResources
застарілий. Тепер ви повинні використовувати методgetDrawable (int id, Resources.Theme theme)
з новим параметром теми.