setBackground vs setBackgroundDrawable(Android)

Pij*_*usn 256 android background view drawable

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

当我使用时setBackground,它表示它已经在API级别16中添加,但我的项目的最小SDK版本是7.我认为它不适用于16以下的任何东西,我是对的吗?但是当我使用setBackgroundDrawable时,它表示它已被弃用.

我应该用什么?

War*_*zit 403

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

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

为此,您需要将buildTarget api 16和min build设置为7或类似的东西.

  • 它阻止我编译.我把有问题的代码放在它自己的函数中,并且只为这个函数禁用了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); } (20认同)
  • 它仍然抱怨不推荐使用setBackgroundDrawable.我真的不得不因为Google想要更改方法名称来抑制警告吗? (4认同)
  • 我设置`android:minSdkVersion ="7"android:targetSdkVersion ="17"`,但是setBackground()出现错误:**调用需要API级别16(当前最小值为7)** (4认同)
  • @ santirivera92是的,或者你可以创建2个项目1个目标,然后再发布1个问题.这听起来像一个简单的选择吗?(实际上有时会这样,ICS中有很多修复) (2认同)
  • @Snicolas是的,IDE或Android应该能够为我们做这种逻辑. (2认同)

Lud*_*vic 111

您可以使用setBackgroundResource()API级别1.

  • ...但是只有你有一个资源ID而不是你创建的自定义可绘制类! (78认同)
  • setBackgroundResource()不能替代setBackgroundDrawable(); 或setBackground();. 根本不相关,第一个添加资源drawable和其他添加CUSTOM drawable. (2认同)

and*_*per 55

似乎目前存在2个功能之间没有区别,在如图所示的源代码(信贷此篇):

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

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }
Run Code Online (Sandbox Code Playgroud)

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

  • 大!谢谢.愚蠢的是,对于像函数重命名一样蹩脚的事情会产生警告. (5认同)

Jos*_*eia 18

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

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();
Run Code Online (Sandbox Code Playgroud)

然后你可以使用"Drawable",应用彩色滤镜等

  • 仅当原始图像来自资源时才有效. (6认同)

kra*_*awa 13

使用 ViewCompat.setBackground(view, background);


Emm*_*mos 12

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

这对我有用.


Aks*_*ert 6

使用Android studio 1.5.1我收到以下警告:

Call requires API level 16 (current min is 9): android.view.View#setBackground
Run Code Online (Sandbox Code Playgroud)

和关于弃用的投诉

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated
Run Code Online (Sandbox Code Playgroud)

使用这种格式,我摆脱了两个:

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }
Run Code Online (Sandbox Code Playgroud)


Ger*_*eto 6

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

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));
Run Code Online (Sandbox Code Playgroud)

一个颜色资源,如下所示:

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));
Run Code Online (Sandbox Code Playgroud)

或者是自定义xml资源,如下所示:

myView.setBackgroundResource(R.drawable.my_custom_background);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!