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

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

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

mContext.getResources().getDrawable(drawableId)

person Blaskovicz    schedule 19.10.2011    source источник


Ответы (6)


Начиная с 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);
}
person Muhammad Soliman    schedule 07.12.2015
comment
context.getDrawable(id); кажется эквивалентным resources.getDrawable(id, context.getTheme()); - person ErickBergmann; 07.03.2017
comment
Это можно сделать одной строкой, если у вас есть библиотека поддержки: ResourcesCompat.getDrawable(resources, id, context.getTheme()); - person k2col; 13.07.2017

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

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

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

person Zain    schedule 06.02.2017
comment
Не могли бы вы дать дополнительные пояснения по выбору - person Nyandika; 04.04.2018

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

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

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

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

и

getResources().getDrawable() больше не рекомендуется

person Inzimam Tariq IT    schedule 13.05.2016

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
person Jens van de Mötter    schedule 06.06.2020

Из API 21 `getDrawable(int id)` устарел

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

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

Но лучший способ сделать это:

- You should create one common class for getting drawable and colors because if in future have any deprecation then you no need to do changes everywhere in your project.You just change in this method
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);
person Sanjayrajsinh    schedule 08.11.2019

person    schedule
comment
Я также обнаружил, что использование контекста приложения работает, спасибо. - person Blaskovicz; 19.10.2011
comment
Начиная с API 22. getDrawable(int id) устарел. Вместо этого используйте getDrawable(int id, Resources.Theme theme). Метод getTheme() должен помочь. - person Isaac Zais; 17.04.2015
comment
У меня есть небольшое сомнение. В этом коде метод getDrawable(int) из типа Resources устарел. Согласно одному ответу SO 1. Неправильно ли использовать устаревшие методы или классы в Java? Из определения deprecated: программный элемент с аннотацией @Deprecated — это элемент, который программистам не рекомендуется использовать, как правило, из-за его опасности или потому, что существует лучшая альтернатива. Какая лучшая альтернатива для этого. - person Killer; 05.08.2015