С новым Android API 22 getResources().getDrawable()
теперь устарела. Теперь лучшим подходом является использование только getDrawable()
.
Что изменилось?
Resources#getDrawable(int)
и другое Resources#getColor(int)
устарели.
С новым Android API 22 getResources().getDrawable()
теперь устарела. Теперь лучшим подходом является использование только getDrawable()
.
Что изменилось?
Resources#getDrawable(int)
и другое Resources#getColor(int)
устарели.
Ответы:
У вас есть несколько вариантов, чтобы справиться с этим устареванием правильным (и перспективным ) способом, в зависимости от того, какой вид рисования вы загружаете:
А) Drawables с атрибутами темы
ContextCompat.getDrawable(getActivity(), R.drawable.name);
Вы получите стиль Drawable в соответствии с инструкциями вашей темы. Это, вероятно, то, что вам нужно.
Б) рисования без атрибутов темы
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
Вы получите свой стиль без рисунка по-старому. Обратите внимание: неResourcesCompat.getDrawable()
считается устаревшим!
ДОПОЛНИТЕЛЬНО) Drawables с атрибутами темы из другой темы
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)
РЕДАКТИРОВАТЬ
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 level 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Для тех, кто все еще может решить эту проблему даже после применения предложения этого потока (я был таким), добавьте эту строку в свой класс Application, метод onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Как предлагается здесь и здесь, иногда это требуется для доступа к векторам из ресурсов, особенно когда вы имеете дело с пунктами меню и т. Д.
В Kotlin вы можете использовать расширение
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)
с новым параметром темы.