当代码需要某个API级别时,为什么必须检查Build.Version是否需要相同而不是等于或高于所需级别?

时间:2014-10-04 15:55:20

标签: android api intellij-idea

当我遇到一个易于修复的问题时,我正在观看Android开发者视频(https://www.youtube.com/watch?v=3UbJhmkeSig),但我很难理解,并希望有人可以对它有所启发对我来说..

我有一个项目,目标是清单中的API级别8,因此当我使用下面的代码时,我收到一条错误消息,指出所使用的代码需要比当前目标API级别更高的API级别。作为解决方法,我在运行时检查了Build版本(http://developer.android.com/training/basics/supporting-devices/platforms.html),并且只在API级别足够的情况下运行代码段。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        ObjectAnimator rotateAnimation = ObjectAnimator.ofFloat(resp1, View.ROTATION, 270);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            rotateAnimation.setRepeatCount(0);
        }
    }

当我添加第一个,最外面的if语句时,我的困惑就出现了。代码行

 ObjectAnimator rotateAnimation = ObjectAnimator.ofFloat(resp1, View.ROTATION, 270);

需要API级别14因此我检查Build.Version.ICS的原因。但是,方法是" setRepeatCout()"来自代码行的方法

            rotateAnimation.setRepeatCount(0);

需要API 11,虽然放在带括号的第一个,最外面的if语句中以确保块而不是行,但我的IDE(IntelliJ IDEA)仍然向我提出错误,指出代码行需要API 11和我的项目针对API 8.我的两个解决方案是将代码放入两个嵌套的if语句中,一个检查API 14和另一个API 11或使用

@TargetApi(Build.VERSION_CODES.HONEYCOMB)

方法开头的注释。但是,我不完全理解关于它如何影响旧设备的注释,也不理解为什么我需要两个if语句来检查Build版本。

-Does @TargetAPI只是摆脱了lint检查或以某种方式影响整个方法以及它是否编译/运行?

- 为什么我需要使用两个if语句?为什么第一个if语句不足以满足两行代码的需要?

- 是否有理由需要使用if语句检查构建,或者这可能是一个错误?我尝试在https://youtrack.jetbrains.com/issues/IDEA搜索已知错误并在Google上搜索结果。

非常感谢

1 个答案:

答案 0 :(得分:2)

  

@TargetAPI是否只是取消了lint检查,或者以某种方式影响整个方法以及它是否编译/运行?

它向Lint指示,对于注释(方法或类)的范围,Lint应将minSdkVersion视为注释中提供的值(例如,HONEYCOMB),而不是您在清单或build.gradle文件中指定的任何内容。

当您作为开发人员验证您正在为该指定的API级别正确处理向后兼容性时,您应用@TargetApi。然后,在将来的某个时间,如果您向高于此API级别的类或方法添加更多代码,那么Lint应该再次对您大喊大叫,因此您意识到需要添加更多向后兼容性检查。

在这种情况下,正确的解决方案是@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH),因为您的代码设置为处理从当前minSdkVersion到API级别14的向后兼容性,但不高(因为您没有使用任何有问题的事情都会更高。)

  

为什么我需要使用两个if语句?为什么第一个if语句不足以满足两行代码的需要?

可能是因为您为HONEYCOMB注释选择了@TargetApi。如果我们在运行API级别14或更高级别的设备上,则根据定义,我们在运行API级别11或更高级别的设备上。您不需要内部if检查。

  

是否有理由需要检查两个位置的构建,或者这可能是一个错误?

我不知道你认为“两个地方”是什么。您需要@TargetApi注释和外if项检查吗?是。你需要if个检查吗?不。并且,如果您将@TargetApi设置为ICE_CREAM_SANDWICH,请删除内部if检查,并获取Lint投诉,这可能是Android插件中的错误。