SetBackground vs setBackgroundDrawable (Android)

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

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

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

Solutions Collecting From Web of "SetBackground vs setBackgroundDrawable (Android)"

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

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

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

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

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

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

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

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

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

Вы можете использовать setBackgroundResource() вместо ie 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); } 

Теперь вы можете использовать любой из этих параметров. И он будет работать в любом случае. Ваш цвет может быть 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); 

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

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

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

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

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

Также убедитесь, что изображение – это первый элемент внутри 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.