setBackground vs setBackgroundDrawable(Android)

我想设置一个视图的可绘制背景。 有两种方法(据我所见): setBackgroundsetBackgroundDrawable

当我使用setBackground ,它说它已经被添加到API级别16中,但是我的项目的最小SDK版本是7.我认为它不会在16以下的任何东西上工作,对吗? 但是,当我使用setBackgroundDrawable,它说它已被弃用。

我该用什么?

它已被弃用,但它仍然有效,所以你可以使用它。 但是,如果你想完全正确的,只是为了它的完整性…你会做下面的事情:

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

为了这个工作,你需要设置buildTarget API 16和最小编译为7或类似的东西。

您可以使用setBackgroundResource()而不是API级别1。

似乎目前这两个函数之间没有任何区别,如源代码所示(信贷到这个职位 ):

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

所以这只是一个命名的决定,类似于填充父母对比匹配父母。

我知道这是一个老问题,但我也有类似的情况,我的解决scheme是

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

然后你可以玩“可绘制”,应用彩色滤光片等等

你可以使用setBackgroundResource()来代替,比如relativeLayout.setBackgroundResource(R.drawable.back);

这对我有用。

使用ViewCompat.setBackground(view, background);

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

希望它有帮助!

使用setBackgroundResource(R.drawable.xml / png)

这对我有用: 查看视图是你的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)); } } 

我也有这个问题,但我使用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 } 

编辑:正如@BlazejCzapp所指出的,如果没有它可以设法解决问题,最好避免使用reflection。 我有一个用例,我不能没有反思,但不是上面的情况下解决。 有关更多信息,请参阅http://docs.oracle.com/javase/tutorial/reflect/index.html