setBackground vs setBackgroundDrawable (Android)

我想设置一个视图的背景绘图。这有两个方法(据我所知):setBackgroundsetBackgroundDrawable

当我使用setBackground时,它说它已添加在空气污染指数16级中,但我的项目的最小SDK版本是7。我猜在16秒以下就不管用了,对吗?但当我使用setBackgroundDrawable时,它说它已弃用。

我应该用什么?

213540 次浏览

它被弃用了,但仍然可以使用,所以你可以使用它。但如果你想完全正确,只是为了它的完整性……你可以这样做:

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设置为7或类似的东西。

你可以使用API级别1中的setBackgroundResource()

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

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

然后你可以使用“绘制”,应用颜色滤镜等等

你还可以这样做:

try {
myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
// do nothing
}

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

似乎目前这两个函数之间没有区别,如<强>源代码< / >强所示(credit to <强>这篇文章< / >强):

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


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

所以这只是一个命名决定,类似于fill-parent vs match-parent。

我也有这个问题,但我使用ImageView做了一个变通。

尝试使用使用并在其中添加一个ImageView (width和height: fill_parent, scaleType: center)。

还要确保imageview是RelativeLayout内的第一个元素,因此它将作为背景。

你可以使用setBackgroundResource()代替,即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);
}
现在你可以使用这两个选项中的任何一个。这在任何情况下都是可行的。 你的颜色可以是十六进制代码,像这样:

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

希望能有所帮助!

使用ViewCompat.setBackground(view, background);

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

这对我来说是有效的:< em > < / em >视图视图是你的editText, spinner…等等。< em > int可拉的< / em >是你的可绘制路由示例(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));
}
}