我想设置视图的背景可绘制。有两种方法(据我所知):setBackground
和 setBackgroundDrawable
。
当我使用 setBackground
时,它说它已添加到 API 级别 16,但我的项目的最低 SDK 版本是 7。我认为它不适用于 16 以下的任何东西,对吗?但是当我使用 setBackgroundDrawable 时,它说它已被弃用。
我应该用什么?
它已被弃用,但它仍然有效,因此您可以使用它。但是如果你想完全正确,只是为了它的完整性......你会做如下的事情:
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 或类似的东西。
您可以改用 API 级别 1 中的 setBackgroundResource()
。
setBackgroundResource(int)
接受资源 id,因此每次都必须为视图充气以设置背景。我不想要这样的行为,假设我已经膨胀了 Drawable。我错过了什么吗?
似乎目前这两个函数之间没有区别,如 source code 所示(归功于 this post):
public void setBackground(Drawable background) {
//noinspection deprecation
setBackgroundDrawable(background);
}
@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }
所以这只是一个命名决定,类似于 fill-parent vs match-parent 。
我知道这是一个老问题,但我有类似的情况,我的解决方案是
button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();
然后你可以玩“Drawable”,应用颜色过滤器等
使用ViewCompat.setBackground(view, background);
您可以改用 setBackgroundResource()
,即 relativeLayout.setBackgroundResource(R.drawable.back);
这对我有用。
使用 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);
}
现在您可以使用其中任何一个选项。无论如何它都会起作用。您的颜色可以是十六进制代码,如下所示:
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);
希望能帮助到你!
这对我有用:查看视图是您的编辑文本、微调器...等。 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));
}
}
使用 setBackgroundResource(R.drawable.xml/png)
我也有这个问题,但我使用 ImageView 做了一个解决方法。
尝试使用 RelativeLayout 并在其中添加一个 ImageView(宽度和高度:fill_parent,scaleType:中心)。
还要确保 imageview 是 RelativeLayout 中的第一个元素,因此它将充当背景。
if
子句。查看正确答案。
你也可以这样做:
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
android:minSdkVersion="7" android:targetSdkVersion="17"
,但是 setBackground() 出现错误:Call requires API level 16 (current min is 7)@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); } }