setBackground против setBackgroundDrawable (Android)

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

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

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

12 ответов


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

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 или что-то подобное.


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


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

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

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

так это просто именования решение, для заполнения родителем матч родителей против .


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

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

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


использовать ViewCompat.setBackground(view, background);


можно использовать setBackgroundResource() вместо т. е. relativeLayout.setBackgroundResource(R.drawable.back);

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


используя 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);
    }

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

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

A цвета ресурс, например:

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

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

myView.setBackgroundResource(R.drawable.my_custom_background);

надеюсь, что это помогает!


используйте setBackgroundResource (R. drawable.xml / png)


это работает для меня: вид это ваш editText, spinner...так далее. И int drawable ваш пример 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));
        }    
    }

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

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

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


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

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

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