setBackground与setBackgroundDrawable(Android)


258

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

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

我应该用什么?


使用:image.setImageResource(R.drawable.icon_dot1);
勇敢的

Answers:


403

它已被弃用,但仍然可以使用,因此您可以使用它。但是,如果您想完全正确,则仅是出于完整性考虑...您可以执行以下操作:

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

为此,您需要将buildTarget api设置为16,并将最小build设置为7或类似的值。


4
它仍然抱怨setBackgroundDrawable被弃用。我真的必须仅仅因为Google想要更改方法名称而抑制警告吗?
查理·布雷克

2
@ santirivera92是的,或者,您可以创建2个项目,1个在目标之前,然后1个。这听起来很简单吗?(实际上有时确实如此,ICS中有很多修复程序)
Warpzit 2012年

4
我设置了android:minSdkVersion="7" android:targetSdkVersion="17",但是setBackground()出现错误:调用需要API级别16(当前最小值为7)
Jonny 2013年

20
它阻止了我进行编译。我将有问题的代码放入其自己的函数中,并且仅针对该函数禁用了lint这样的代码。@TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
强尼

2
@Snicolas是的,IDE或Android应该能够为我们执行这种逻辑。
Warpzit

111

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


78
...但仅当您获得资源ID而不是您创建的自定义可绘制类时!
Zordid

有没有方法可以检索您具有引用的可绘制对象的ID?
Poutrathor 2014年

2
setBackgroundResource()不能替代setBackgroundDrawable(); 或setBackground();。完全没有关系,第一个添加资源可绘制,其他添加CUSTOM可绘制。
MBH 2015年

如果我必须反复设置背景,例如在列表视图中该怎么办?setBackgroundResource(int)接受资源ID,因此每次设置背景时都必须使视图膨胀。假设我已经夸大了Drawable,我不希望这样。我想念什么吗?
azizbekian 2015年

如果我只有可绘制对象怎么办!
MBH 2015年

55

似乎目前这两个函数之间没有区别,如源代码所示(贷记此帖子):

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

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

因此,这只是一个命名决定,类似于fill-parent与match-parent的决定。


5
大!谢谢。愚蠢的是,对于像函数重命名一样la脚的东西生成警告。
某处某人2014年

1
@ M.kazemAkhgary这不是他们第一次不只是为了更名而弃用某些东西。他们将布局参数值的“ fill_parent”更改为“ match_parent”。两者都是完全一样的东西,指向同一个值..
Android开发者

18

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

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

然后您可以玩“ Drawable”,应用滤色器等


6
仅当原始图像来自资源时才有效。
Matt Huggins

这甚至无法回答OP的问题。
Petro 2015年


12

你可以setBackgroundResource()改用ierelativeLayout.setBackgroundResource(R.drawable.back);

这对我有用。


7

现在,您可以使用这些选项之一。它在任何情况下都将起作用。您的颜色可以是十六进制代码,如下所示:

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

希望能帮助到你!


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

1

这对我有用:视图视图是您的editText,微调框...等。而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));
        }    
    }


-2

我也遇到了这个问题,但是我使用ImageView进行了变通。

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

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


1
实际上,它应该只是一个if子句。查看正确答案。
Pijusn 2014年

-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


4
@BlazejCzapp大声笑,但它确实回答了这个问题,因此不加解释就不应被否决。当您告诉孩子不做某事而不告诉他们为什么这样做时;)
Fabricio

11
我不想离开话题,但是有一些原因:1. Java是一种静态类型的语言-使用编译器;2.这只是一个变相的if陈述(混淆了真实的逻辑);3.它正在发出加农炮杀死蚊子-该代码正在使用一些严重的火炮来解决一个小问题;希望证明它有点
BłażejCzapp

感谢@BlazejCzapp,您是对的,我在这里有一个用例,在这里需要执行类似上面的代码的操作,但是如果有适当的方法可以使用它,则不要使用它。
Fabricio

2
这太蠢了……绝对没有理由使用反射来实现这一目标。
Alex Lockwood 2014年

是的,告诉有人问一个简单的问题:“我应该使用什么?” 开始修改运行时。
Petro 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.