Як створити Dravable з ресурсу


283

У мене є зображення res/drawable/test.png(R.dravable.test).
Я хочу передати це зображення функції, яка приймає Drawable, наприклад mButton.setCompoundDrawables().

Тож як я можу перетворити ресурс зображення в формат Drawable?

Відповіді:


567

У вашій діяльності має бути метод getResources. Зробіть:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
Якщо вам здається, що ви хочете цього поза класом діяльності, вам доведеться знайти інший спосіб досягти контексту, де живе getResources (); ця відповідь рекомендує передати його в конструктор
rymo

50
Згідно з версією API 21, цей спосіб застарілий, і його слід замінити на: Dravable dravable = ResourcesCompat.getDravable (getResources (), page.getImageId (), null);
Борен

3
@Boren це те саме, що використовувати ContextCompat.getDravable (це, R.dravable.icon) ;?
Зак

2
Жодна з перерахованих вище пропозицій, здається, не працює, якщо R.dravable.icon є векторним малюнком.
FractalBob

4
НЕ ВИКОРИСТОВУЙТЕ ЦЕ, ЩО ВИ ВИКОРИСТОВУЄТЬСЯ ВЕКТОРНИЙ КРАЙ Використовуйте натомість AppCompatResources.getDravable (контекст, R.dravable.icon).
Дхаваль Патель

136

Цей код застаріло:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Використовуйте це замість:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
Майте на увазі, що це стосуватиметься теми із заданого контексту. Якщо ви хочете переконатися, що жодна тема не використовується, ви можете використовувати ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(де 3-й парам - необов'язковий екземпляр теми).
vaughandroid

23

getDrawable (int id)Метод амортизації станом API 22.

Натомість слід використовувати getDrawable (int id, Resources.Theme theme)для API 21+

Код виглядав би приблизно так.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

чому б не пропустити null для кожної api? Плюс: Ви впевнені, що нуль - найкращий варіант?
jonathanrz

1
GetDrawable (int id, Resources.Theme theme) з’явився лише до API 21.
Кріс Стелвелл

абоgetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Саймон Фезерстоун

13

Я просто хотів би додати, що якщо ви отримуєте "застаріле" повідомлення під час використання getDravable (...), замість цього слід використовувати наступний метод із бібліотеки підтримки.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

Не потрібно використовувати getResources () при використанні цього методу.

Це рівнозначно робити щось подібне

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

Це працює як до, так і після Lollipop версій.


4

Отримайте Dravable з векторного ресурсу незалежно від того, є його вектор чи ні:

AppCompatResources.getDrawable(context, R.drawable.icon);

Примітка:
ContextCompat.getDrawable(context, R.drawable.icon); буде вироблятися android.content.res.Resources$NotFoundExceptionдля векторного ресурсу.


3

Якщо ви намагаєтеся отримати зображення, що відображається, з виду, де зображення встановлено як,

ivshowing.setBackgroundResource(R.drawable.one);

тоді Dravable поверне лише нульове значення із наступним кодом ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Отже, краще встановити зображення за допомогою наступного коду, якщо ви хочете отримати малюнок з певного виду.

 ivshowing.setImageResource(R.drawable.one);

тільки тоді ми будемо точно конвертувати те, що можна отримати.


1

Якщо ви успадковуєте фрагмент, ви можете зробити:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

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