setBackground vs setBackgroundDrawable(Android)

时间:2012-08-14 07:24:38

标签: android view background drawable

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

当我使用setBackground时,它表示它已添加到 API级别16 中,但我的项目的min SDK版本是7.我认为它不适用于16以下的任何内容,我对吗?但是当我使用setBackgroundDrawable时,它表示它已被弃用。

我应该使用什么?

12 个答案:

答案 0 :(得分:397)

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

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

答案 1 :(得分:108)

您可以使用setBackgroundResource()代替API级别1。

答案 2 :(得分:55)

似乎目前两个功能之间没有区别,如source code所示(信用额度为this post):

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

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

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

答案 3 :(得分:18)

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

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

然后你可以玩“Drawable”,应用彩色滤镜等

答案 4 :(得分:13)

使用ViewCompat.setBackground(view, background);

答案 5 :(得分:12)

您可以使用setBackgroundResource()代替relativeLayout.setBackgroundResource(R.drawable.back);

这适合我。

答案 6 :(得分:6)

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

答案 7 :(得分:6)

现在您可以使用其中任何一个选项。它无论如何都会起作用。 您的颜色可以是十六进制代码,如下所示:

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

希望它有所帮助!

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:-2)

我也有这个问题,但我使用 ImageView 进行了解决方法。

尝试使用 RelativeLayout 并在其中添加ImageView(宽度和高度:fill_parent,scaleType:center)。

同时确保imageview是RelativeLayout中的第一个元素,因此它将作为背景。

答案 11 :(得分:-4)

你也可以这样做:

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