SetBackground vs setBackgroundDrawable (Android)

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Используйте ViewCompat.setBackground(view, background);

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

Это работает для меня: Просмотреть представление - это ваш 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));
        }    
    }

Ответ 11

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

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

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

Ответ 12

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

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