Как создать Drawable из ресурса


283

У меня есть изображение res/drawable/test.png(R.drawable.test).
Я хочу передать это изображение функции, которая принимает Drawable, например mButton.setCompoundDrawables().

Итак, как я могу преобразовать ресурс изображения в Drawable?

Ответы:


567

Ваша активность должна иметь метод getResources. Делать:

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

2
Если вам захочется этого за пределами класса Activity, вам нужно будет найти какой-то другой способ достичь контекста, в котором живет getResources (); этот ответ рекомендует передать его в конструктор
rymo

50
Начиная с версии API 21 этот метод считается устаревшим, и его следует заменить следующим образом: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Борен

3
@Boren - это то же самое, что использовать ContextCompat.getDrawable (this, R.drawable.icon) ;?
Зак

2
Ни одно из приведенных выше предложений не работает, если R.drawable.icon является векторным объектом.
FractalBob

4
НЕ ИСПОЛЬЗУЙТЕ ЭТО, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ VECTOR DRAWABLE. Вместо этого используйте AppCompatResources.getDrawable (context, R.drawable.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-й параметр является необязательным экземпляром Theme).
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? Плюс: Вы уверены, что ноль - лучший вариант?
Джонатанрз

1
Функция getDrawable (int id, тема Resources.Theme) появилась только до API 21.
Крис Стиллвелл,

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

13

Я просто хотел бы добавить, что если вы получаете сообщение «устарело» при использовании getDrawable (...), вы должны использовать вместо этого следующий метод из библиотеки поддержки.

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

Получить Drawable из векторного ресурса, независимо от того, является ли он векторным или нет:

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

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


3

Если вы пытаетесь получить отрисовку из вида, где изображение установлено как,

ivshowing.setBackgroundResource(R.drawable.one);

тогда drawable вернет только нулевое значение со следующим кодом ...

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

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

 ivshowing.setImageResource(R.drawable.one);

только тогда мы сможем точно преобразовать Drawable.


1

Если вы наследуете от фрагмента, вы можете сделать:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.