setBackground与setBackgroundDrawable的区别(Android)

259
我想设置一个视图的背景可绘制。根据我看到的,有两种方法:setBackground和setBackgroundDrawable。
当我使用setBackground时,它说它已经在API级别16中添加,但我的项目的最小SDK版本为7。我认为它在低于16的任何设备上都不起作用,我是对的吗?但是当我使用setBackgroundDrawable时,它说已被弃用。
我应该使用什么?

使用:image.setImageResource(R.drawable.icon_dot1); - Brave
12个回答

-2

我之前也遇到过这个问题,但是我用一个ImageView来解决了它。

你可以尝试使用一个RelativeLayout,并在里面添加一个ImageView(宽度和高度:fill_parent,scaleType:center)。

还要确保ImageView是RelativeLayout中的第一个元素,这样它就会充当背景。


1
实际上,它本应该只是一个 if 语句。请查看正确的答案。 - Pijusn

-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żej Czapp
谢谢@BlazejCzapp,你是对的。我这里有一个使用案例,需要像上面的代码一样做一些事情,但如果有适当的处理方式,就不应该使用它。 - Fabricio
2
这很愚蠢... 没有任何理由使用反射来实现这个。 - Alex Lockwood
告诉那些问一个简单问题“我应该使用什么?”的人,不要开始修改运行时。 - Petro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接