setBackground vs setBackgroundDrawable(Android)
我想设置一个视图的可绘制背景。 有两种方法(据我所见): setBackground
和setBackgroundDrawable
。
当我使用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