Android: альтернатива context.getDrawable ()

87

В context.getDrawable()своем проекте я использовал вот что:

Drawable greenProgressbar = context.getDrawable(R.drawable.custom_progressbargreen);

Но Eclipse выдает ошибку, требующую Minimum API level of 21. Это будет означать, что после быстрого поиска в Google мое приложение можно будет использовать только Android 5.0. Поскольку не все устройства используют эту версию Android, я хотел бы иметь альтернативу context.getDrawable().

Брэм
источник

Ответы:

203

Ранее принятый метод объявлен устаревшим согласно документации SDK 22:

До android.os.Build.VERSION_CODES # JELLY_BEAN эта функция не могла правильно получать окончательную плотность конфигурации, если переданный здесь идентификатор ресурса является псевдонимом для другого ресурса Drawable. Это означает, что если конфигурация плотности ресурса псевдонима отличается от фактического ресурса, плотность возвращаемого Drawable будет неправильной, что приведет к плохому масштабированию.

Как указано в этом ответе, лучшим решением было бы использовать ContextCompat : ContextCompat.getDrawable(context, R.drawable.***)

user2417480
источник
1
Я принял этот ответ сейчас, так как он более актуален :)
Брэм
26

Попробуйте добавить getResources()после контекста, так что это:

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

должно сработать.

glm9637
источник
4
Resources.getDrawable устарел в пользу Context.getDrawable
Джо Баубир,
12

У меня была такая же ситуация, когда я хотел сослаться на метод getDrawable (), который теперь устарел.

что я использовал,

myButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_btn_off));

Надеюсь, что это поможет вам

Уманда
источник
9

Раньше у меня была похожая проблема. Вы пробовали сделать это вот так?

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

источник
Это устарело.
Таслим Осени
2

Попробуй это:

AppCompatResources.getDrawable(context, R.drawable.*)
Нандо
источник
1

Вы должны использовать getDrawable (id, this.getTheme ()). Этот метод до сих пор не считается устаревшим.

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

Я согласен использовать ContextCompact.getDrawable (Context context, int resID). У меня это сработало, и мое приложение нацелено на API 19.

Кайлен Трэвис Пиллэй
источник
1

Вы также можете установить ресурс напрямую, не работая с drawable (Kotlin):

btn.setImageResource(R.drawable.ic_XXX)
Лукас Моос
источник
1

Решение для Kotlin-программистов выглядит так:

val greenProgressbar = context!!.getDrawable(R.drawable.custom_progressbargreen)

или (из API 22)

val greenProgressbar = ContextCompat.getDrawable(R.drawable.custom_progressbargreen)
Йенс ван де Мёттер
источник