Як отримати об’єкт Dravable з ідентифікатора ресурсу в пакеті Android?


156

Мені потрібно отримати об’єкт Dravable для відображення на кнопці зображення. Чи є спосіб використовувати код нижче (або щось подібне), щоб отримати об’єкт з пакету android.R.dravable. *?

наприклад, якщо dravableId був android.R.dravable.ic_delete

mContext.getResources().getDrawable(drawableId)

Відповіді:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

Я також виявив, що використання контексту програми, здається, працює, дякую.
Blaskovicz

20
Станом на API 22. getDrawable(int id)застаріло. Використовуйте getDrawable(int id, Resources.Theme theme)замість цього. Метод getTheme()повинен бути корисним.
Ісаак Заїс

1
У мене є невеликі сумніви. У цьому коді "Метод getDravable (int) від типу Resources є застарілим". Відповідно до однієї відповіді ТА 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)


2
Надайте, будь ласка, додаткові пояснення щодо вибору
Nyandika

3

найкращий спосіб

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

АБО це для Dravable зліва і щось подібне для правого і т.д.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.