260

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

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

我应该用什么?

4

12 回答 12

405

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

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

于 2012-08-14T07:35:55.137 回答
112

您可以改用setBackgroundResource()API 级别 1 中的那个。

于 2013-02-06T09:37:03.043 回答
55

似乎目前这两个函数之间没有区别,如源代码所示(归功于这篇文章):

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

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

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

于 2013-09-17T07:54:32.357 回答
19

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

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

然后你可以玩“Drawable”,应用颜色过滤器等

于 2013-03-29T23:20:43.673 回答
13

采用ViewCompat.setBackground(view, background);

于 2016-12-12T10:36:53.970 回答
12

你可以setBackgroundResource()改用,即relativeLayout.setBackgroundResource(R.drawable.back);

这对我有用。

于 2015-04-24T11:10:27.837 回答
7

使用 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);
    }
于 2016-01-22T09:10:42.190 回答
7

现在您可以使用其中任何一个选项。无论如何它都会起作用。您的颜色可以是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);

希望能帮助到你!

于 2016-04-11T16:03:12.183 回答
1

这对我有用:查看视图是您的编辑文本、微调器...等。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));
        }    
    }
于 2017-09-29T20:06:07.053 回答
0

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

于 2017-03-01T19:56:26.743 回答
-2

我也遇到了这个问题,但我使用ImageView做了一个解决方法。

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

还要确保 imageview 是 RelativeLayout 中的第一个元素,因此它将充当背景。

于 2014-08-02T11:49:01.863 回答
-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

于 2013-04-02T11:56:21.583 回答