如何在Android API 10-18中将位图设置为视图的背景?

10

我所拥有的是:

清单:

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="18" />

来源:

View view = createViewFromWhatever();
Bitmap bitmap = loadSomethingAddMore();

在我搜索的所有地方,这是被认可、建议的:

view.setBackgroundDrawable(new BitmapDrawable(bitmap));

但在API 18中已被弃用。我受到框架错误和操作系统级别缺失文档的困扰。我想尊重他们所说的话,并在崩溃时“这不是我的错”。

我甚至不能使用 new BitmapDrawable(bitmap),而需要改为 new BitmapDrawable(getActivity().getResources(), bitmap)。如果我将方法更改为建议的方式:setBackground(new BitmapDrawable(getActivity().getResources(), bitmap));

将会出现以下错误信息:

调用需要API级别16(当前最小值为10):android.widget.RelativeLayout#setBackground

作为解决方案,我可以检查用户正在运行的版本,并进行if-else,然后我就会有一个带有if(isAndroidVersion10()) else if () ...代码的代码。

是否有任何可接受的解决方案?

如果我通过反射避免了过时警告,那么在崩溃的情况下,我仍然有责任,因为我发布了具有过时方法的代码! -只是我调用方式不同。

如果我忽略该Lint,则会在低版本API上崩溃,已经测试过了。

当然,我希望支持API 10,因此无法接受此处的大多数答案。

4个回答

20

很快就搞定了,从这里得到了一个可接受的解决方案

        if (android.os.Build.VERSION.SDK_INT >= 16){
            setBackgroundV16Plus(mRootView, bitmap);
        }
        else{
            setBackgroundV16Minus(mRootView, bitmap);
        }



@TargetApi(16)
private void setBackgroundV16Plus(View view, Bitmap bitmap) {
    view.setBackground(new BitmapDrawable(getActivity().getResources(), bitmap));

}

@SuppressWarnings("deprecation")
private void setBackgroundV16Minus(View view, Bitmap bitmap) {  
    view.setBackgroundDrawable(new BitmapDrawable(bitmap));
}

人们...一个简单的setBackground()...

Google开始从iOS复制不起作用的东西(旋转,pushModal在4.3,5,6中非常不同),开发多个版本很糟糕。


1
“废弃”并不意味着某个东西无法使用。根据源代码视图,最新版的Android中setBackground的定义如下:
public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

截至目前,您可以在所有API级别上使用setBackgroundDrawable。这并不意味着检查SDK_INT不是一个好主意,因为未来版本可能会更改setBackground的工作方式。

+1,我在源代码中看到了那个。问题是当应用程序由于某些原因崩溃时,我无法清楚地证明是用户的错误还是操作系统的错误。那一瞬间我就有罪了,因为它是显而易见的:我使用了已弃用的方法...或者你能向我的用户、客户解释“仅仅因为某些东西被弃用并不意味着它不起作用”,当他们遇到崩溃时? :) - user529543

0
有点晚了,但我认为你的崩溃原因是由于OutOfMemoryExceptions而不是setBackground方法...确保在将位图设置为背景之前高效地加载它们。这可能会有所帮助 这里

0
如果你想避免已接受答案中发布的模板代码,请尝试这个方法:
public static void setBitmapCompat(View view, Bitmap bitmap) {
    BitmapDrawable bd = new BitmapDrawable(view.getContext().getResources(), bitmap);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        view.setBackground(bd);
    } else {
        view.setBackgroundDrawable(bd);
    }
}

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