当我遇到一个易于修复的问题时,我正在观看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上搜索结果。
非常感谢
答案 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插件中的错误。