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)and I neednew 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 处崩溃。

Ofc 我想支持 API 10 ,所以不能接受这里的大部分答案

4

4 回答 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()...

谷歌开始从 iOS 复制非工作的东西(旋转,pushModal 在 4.3,5,6 中非常不同)开发多版本可怕

于 2013-09-14T21:55:22.507 回答
1

仅仅因为某些东西被弃用并不意味着它不起作用。从View source来看,定义setBackground是(截至最新版本的 Android):

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

因此,到目前为止,您当然可以只使用setBackgroundDrawable所有 API 级别。这并不是说检查 SDK_INT 不是一个好主意,因为未来的版本可能会改变setBackground工作方式。

于 2013-09-14T22:29:42.077 回答
0

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

于 2014-10-06T21:41:55.803 回答
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);
    }
}
于 2016-12-15T08:41:27.127 回答