Build.VERSION.SDK_INT具有非法值

时间:2013-09-05 09:49:54

标签: android

我的应用程序支持Android 2.3.3版(SDK 10)及更高版本。我有一个简单的代码:

private void setBackgroundToView(View view, Drawable drawable) {
    if (Build.VERSION.SDK_INT >= 16) {
        view.setBackground(drawable);
    } else {
        view.setBackgroundDrawable(drawable);
    }
}

我发现在GT-I9100G上安装了android 4.0.3,这将有sdk版本15跟随日志:

I/dalvikvm(13683): Could not find method android.view.View.setBackground, referenced from method %some_package%.setBackgroundToView

这意味着Build.VERSION.SDK_INT的值超过15。

  1. 在这种情况下,如何防止非法调用不受支持的方法?

  2. 对于相同的SDK版本,是否每个设备和os版本的固件都相同sdk_int?

  3. 我可以使用Build.VERSION.RELEASE来检查版本号吗?

4 个答案:

答案 0 :(得分:4)

请注意,日志标记为I以获取信息,而不是E标记错误。

类加载器加载代码,在验证字节码时,它会找到对缺少方法的调用并记录它。代码本身没有被执行,如果是,你会得到NoSuchMethodError

您的SDK_INT值正常工作。

答案 1 :(得分:0)

为什么不一直只使用setBackgroundDrawable

此外,您应该调试该设备的SDK-INT版本,而不是仅假设它是15左右。

答案 2 :(得分:0)

如前所述,我只会使用setBackgroundDrawable,因为你没有任何setBackground的优点,无论如何。

如果您仍想使用它。重新检查设备的SDK版本。我不知道Build.VERSION.SDK_INT没有正确设置的任何设备。如果setBackground引发异常,你也可以执行try / catch并回退到setBackgroundDrawable。

答案 3 :(得分:0)

我使用此代码:

    if (Build.VERSION.SDK_INT<16){
        rl.setBackgroundDrawable(getResources().getDrawable(image));
    } else {
        rl.setBackground(getResources().getDrawable(image));
    }

好的,您可以随时使用上面提到的setBackgroundDrawable,但如果不这样做,上面的代码就可以完美运行。