setBackground против setBackgroundDrawable (Android)


258

Я хочу установить фон для рисования вида. Для этого есть два метода (насколько я вижу): setBackgroundи setBackgroundDrawable.

Когда я использую setBackground, он говорит, что он был добавлен на уровне API 16, но минимальная версия SDK моего проекта - 7. Я предполагаю, что он не будет работать на чем-то ниже 16, я прав? Но когда я использую setBackgroundDrawable, он говорит, что это устарело.

Что я должен использовать?


Использование: image.setImageResource (R.drawable.icon_dot1);
Храбрый

Ответы:


403

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

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}

Чтобы это работало, вам нужно установить buildTarget api 16 и min build на 7 или что-то подобное.


4
Он все еще жалуется на то, что setBackgroundDrawable устарела. Неужели я должен подавлять предупреждения только потому, что Google хотел изменить имя метода?
Чарли-Блейк

2
@ santirivera92 Да, у вас есть альтернатива: вы можете создать 2 проекта, 1 нацеливание до того, как это стало проблемой, и 1 после. Это звучит как легкий вариант? (На самом деле иногда это происходит, так много исправлений в ICS)
Warpzit 25.10.12

4
Я установил android:minSdkVersion="7" android:targetSdkVersion="17", однако setBackground () выходит как ошибка: вызов требует API уровня 16 (текущий минимум 7)
Джонни

20
Это помешало мне скомпилировать. Я поместил проблемный код в его собственную функцию и отключил lint только для этой функции, как эта. @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
Джонни

2
@Snicolas Да, IDE или Android должны быть в состоянии сделать такую ​​логику для нас.
Warpzit

111

setBackgroundResource()Вместо этого вы можете использовать API уровня 1.


78
... но только если у вас есть идентификатор ресурса, а не пользовательский класс для рисования, который вы создали!
Зордид

не существует метода для получения идентификатора отрисовки, на которую у вас есть ссылка?
Путратор

2
setBackgroundResource () не является альтернативой setBackgroundDrawable (); или setBackground () ;. Совсем не связано, первый добавляет ресурс для рисования, а остальные - для CUSTOM.
MBH

Что делать, если мне нужно повторно установить фон, скажем, в виде списка? setBackgroundResource(int)принимает идентификатор ресурса, поэтому он должен раздувать представление каждый раз, чтобы установить фон. Я не хочу такого поведения, при условии, что я уже раздувал Drawable. Я что-то упускаю?
Азизбекян

Что делать, если у меня есть только Drawable!?
MBH

55

Кажется, что в настоящее время нет никакой разницы между двумя функциями, как показано в исходном коде (ссылка на этот пост ):

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

так что это просто решение об именовании, аналогичное тому, что для fill-parent или match-parent.


5
здорово! Спасибо. Глупо, что генерируется предупреждение для чего-то такого же хромого, как функция переименования.
Кто-то где-то

1
@ M.kazemAkhgary Это не первый раз, когда они осуждают что-то только для смены имени. У них было "fill_parent", изменяемое на "match_parent" для значений параметров макета. И то, и другое - одно и то же, указывая на одно и то же значение.
разработчик Android

18

я знаю, что это старый вопрос, но у меня похожая ситуация, и мое решение было

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();

а затем вы можете играть с «Drawable», применяя цветовые фильтры и т. д.


6
Это работает, только если исходное изображение исходит от ресурса.
Мэтт Хаггинс

Это даже не отвечает на вопрос ОП.
Петр


12

вы могли бы использовать setBackgroundResource()вместо того, т.е.relativeLayout.setBackgroundResource(R.drawable.back);

это работает для меня.


7

Теперь вы можете использовать любой из этих вариантов. И это сработает в любом случае. Ваш цвет может быть HEX-кодом , например так:

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

Цвет ресурс , как это:

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

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

myView.setBackgroundResource(R.drawable.my_custom_background);

Надеюсь, поможет!


6

Используя Android studio 1.5.1, я получил следующие предупреждения:

Call requires API level 16 (current min is 9): android.view.View#setBackground

и жалобы на амортизацию

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated

Используя этот формат, я избавился от обоих:

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }

1

Это работает для меня: представление представления - это ваш editText, spinner ... и т. Д. И int drawable - ваш пример прорисовываемого маршрута (R.drawable.yourDrawable)

 public void verifyDrawable (View view, int drawable){

        int sdk = Build.VERSION.SDK_INT;

        if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(
                    ContextCompat.getDrawable(getContext(),drawable));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(getResources().getDrawable(drawable));
        }    
    }


-2

У меня также была эта проблема, но я сделал обходной путь, используя ImageView .

Попробуйте использовать RelativeLayout и добавьте в него ImageView (ширина и высота: fill_parent, scaleType: center).

Также убедитесь, что imageview является первым элементом внутри RelativeLayout, чтобы он действовал как фон.


1
На самом деле это должен был быть не более чем ifпункт. Смотрите правильный ответ.
Pijusn

-4

Вы также можете сделать это:

try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}

РЕДАКТИРОВАТЬ: Как указано @BlazejCzapp, предпочтительнее избегать использования отражения, если вам удастся решить проблему без него. У меня был случай использования, когда я не мог решить без отражения, но это не случай выше. Для получения дополнительной информации, пожалуйста, посмотрите на http://docs.oracle.com/javase/tutorial/reflect/index.html


4
@BlazejCzapp LOL, но он ДАЕТ ответ на вопрос, поэтому не стоит опускать голос без объяснения причин. Когда вы говорите ребенку не делать что-то, не объясняя, почему они это сделают;)
Fabricio

11
Я не хочу уходить от темы, но вот несколько причин: 1. Java - статически типизированный язык - используйте компилятор; 2. Это просто скрытое утверждение if (оно запутывает истинную логику); 3. Он выпускает пушку, чтобы убить комара - этот код использует серьезную артиллерию для решения тривиальной проблемы; Надеюсь, что это несколько оправдывает
Błażej Czapp

Спасибо @BlazejCzapp, вы правы, у меня был пример использования, когда необходимо было сделать что-то вроде приведенного выше кода, но его не следует использовать, если есть правильный способ справиться с этим.
Fabricio

2
Это глупо ... нет абсолютно никакой причины использовать рефлексию для достижения этой цели.
Алекс Локвуд

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