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