Android getResources(). GetDrawable() устаревший API 22

С новым Android API 22 getResources().getDrawable() теперь устарела. Теперь лучшим подходом является использование только getDrawable().

Что изменилось?

Ответ 1

У вас есть некоторые опции, позволяющие справиться с этим устареванием в правильном (и будущем доказательстве), в зависимости от того, какой тип выгружаемого вы загружаете:


A) чертежи с атрибутами темы

ContextCompat.getDrawable(getActivity(), R.drawable.name);

Вы получите стилизованный Drawable, как указано в разделе "Активность". Это, вероятно, то, что вам нужно.


B) чертежи без атрибутов темы

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Вы получите свой неоригинальный доступный старый способ. Обратите внимание: ResourcesCompat.getDrawable() не устарел!


EXTRA) рисунки с атрибутами темы из другой темы

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

Ответ 2

Изменить: см. мой пост в блоге по этому вопросу для более полного объяснения


Вместо этого вы должны использовать следующий код из библиотеки поддержки:

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

Ответ 3

Заменить эту строку:   getResources().getDrawable(R.drawable.your_drawable)

с ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

ИЗМЕНИТЬ

ResourcesCompat также устарел. Но вы можете использовать это:

ContextCompat.getDrawable(this, R.drawable.your_drawable) (Здесь this - это контекст)

для более подробной информации перейдите по этой ссылке: ContextCompat

Ответ 4

getResources().getDrawable() устарел на уровне API 22. Теперь мы должны добавить тему:

getDrawable (int id, Resources.Theme 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));
}

Ответ 5

Вы можете использовать

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

которые работают для меня

Ответ 6

Просто пример того, как я исправил проблему в массиве, чтобы загрузить 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)));

Ответ 7

Попробуйте следующее:

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

Ответ 8

en api level 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));

Ответ 9

Если вы нацеливаетесь на SDK> 21 (леденец или 5.0), используйте

context.getDrawable(R.drawable.your_drawable_name)

см. документы

Ответ 10

Теперь вам нужно реализовать так

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

Достаточно одной строки кода, все позаботится о ContextCompat.getDrawable

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

Ответ 11

getDrawable (int drawable) устарело на уровне API 22. Для справки смотрите эту ссылку.

Теперь, чтобы решить эту проблему, мы должны передать новый конструктор вместе с идентификатором как: -

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)

Надеюсь, это поможет вам. Спасибо.

Ответ 12

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