Как вы получаете Drawable объект из идентификатора ресурса в пакете Android?

156

Мне нужно получить объект Drawable для отображения на кнопке изображения. Есть ли способ использовать код ниже (или что-то подобное), чтобы получить объект из пакета android.R.drawable. *?

например, если drawableId был android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
источник

Ответы:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Пит Хьюстон
источник
Я также обнаружил, что использование контекста приложения, кажется, работает, спасибо.
Бласкович
20
По состоянию на API 22. getDrawable(int id)устарела. Используйте getDrawable(int id, Resources.Theme theme)вместо этого. Метод getTheme()должен быть полезным.
Исаак Зайс
1
У меня есть небольшое сомнение. В этом коде «Метод getDrawable (int) из типа Resources устарел». Согласно одному ответу SO 1. Неправильно ли использовать устаревшие методы или классы в Java? Из определения не рекомендуется: «Программный элемент, аннотированный @Deprecated, - это тот, который программистам не рекомендуется использовать, обычно потому, что он опасен или потому что существует лучшая альтернатива». Что является лучшей альтернативой для этого.
Убийца
107

Начиная с API 21 , вы должны использовать getDrawable(int, Theme)метод вместо getDrawable(int), поскольку он позволяет вам выбрать drawableобъект, связанный с определенным resource IDдля данного screen density/theme. Вызов deprecated getDrawable(int)метода эквивалентен вызову getDrawable(int, null).

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

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Использование этого метода эквивалентно вызову:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Мухаммед Солиман
источник
context.getDrawable(id);кажется эквивалентнымresources.getDrawable(id, context.getTheme());
ErickBergmann
Это можно сделать в одну строку, если у вас есть библиотека поддержки:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

Начиная с API 21, вы также можете использовать:

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

Вместо того ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Zain
источник
2
Не могли бы вы дать дальнейшие объяснения по поводу выбора
Nyandika
3

лучший способ это

 button.setBackgroundResource(android.R.drawable.ic_delete);

ИЛИ это для Drawable слева и что-то подобное для справа и т. Д.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

и

getResources().getDrawable() сейчас устарела

Инзимам Тарик ИТ
источник
0

От API 21 getDrawable(int id)устарела. Так что теперь вам нужно использовать

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Но лучший способ сделать это: вы должны создать один общий класс для рисования и цветов, потому что если что-то изменится или устареет в будущем, вам не нужно менять везде в вашем проекте. Вы просто измените этот метод

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

используйте этот метод как:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);
Sanjayrajsinh
источник
0

Следуя решению для программистов Kotlin (из API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Йенс ван де Моттер
источник