Android 当代码需要特定的API级别时,为什么Build.Version的检查必须与所需的相同,而不是处于或高于所需的级别?
我正在观看一个关于房地产动画的安卓开发者视频(),突然遇到了一个很容易解决但对我来说很难理解的问题,希望有人能为我解释一下 我有一个项目的目标是清单中的API级别8,因此当我使用下面的代码时,我得到一个错误,指出所使用的代码需要比当前目标API级别更高的API级别。作为一种解决方法,我在运行时()检查了构建版本,并且仅在API级别足够时才运行代码段Android 当代码需要特定的API级别时,为什么Build.Version的检查必须与所需的相同,而不是处于或高于所需的级别?,android,api,intellij-idea,Android,Api,Intellij Idea,我正在观看一个关于房地产动画的安卓开发者视频(),突然遇到了一个很容易解决但对我来说很难理解的问题,希望有人能为我解释一下 我有一个项目的目标是清单中的API级别8,因此当我使用下面的代码时,我得到一个错误,指出所使用的代码需要比当前目标API级别更高的API级别。作为一种解决方法,我在运行时()检查了构建版本,并且仅在API级别足够时才运行代码段 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
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);
rotateAnimation.setRepeatCount(0);
需要API级别14,因此我需要检查Build.Version.ICS。但是,该方法从代码行中删除了“setRepeatCout()”方法
ObjectAnimator rotateAnimation = ObjectAnimator.ofFloat(resp1, View.ROTATION, 270);
rotateAnimation.setRepeatCount(0);
需要API 11,尽管将其放在第一个最外层的if语句中并用括号括起来,以确保一个块而不是一行,但我的IDE(IntelliJ IDEA)仍然向我显示错误,指出代码行需要API 11,而我的项目目标是API 8。我的两个解决方案是将代码放入两个嵌套的if语句中,一个检查API 14,另一个检查API 11,或者使用
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
方法开头的注释。但是,我不完全理解注释对旧设备的影响,也不理解为什么需要两条if语句来检查构建版本
-@TargetAPI只是简单地去掉了lint检查,还是以某种方式影响了整个方法,以及它是否编译/运行
-为什么我需要使用两个if语句?为什么第一个if语句不能满足两行代码的要求
-是否有必要同时使用if语句检查构建,或者这可能是一个bug?我试着在google上搜索已知的bug和搜索结果
非常感谢
@TargetAPI
是简单地去除了lint检查,还是以某种方式影响了整个方法,以及它是否编译/运行
它向Lint指出,对于注释(方法或类)的范围,Lint应将minSdkVersion
视为注释中提供的值(例如,HONEYCOMB
),而不是在清单或build.gradle
文件中指定的值
当您作为开发人员验证是否正确处理指定API级别的向后兼容性时,您将应用@TargetApi
。然后,在将来的某个时候,如果您向高于此API级别的类或方法添加了更多代码,那么Lint应该再次对您大喊大叫,因此您意识到需要添加更多向后兼容性检查
在本例中,正确的解决方案是@TargetApi(Build.VERSION\u CODES.ICE\u CREAM\u SANDWICH)
,因为您的代码设置为处理从当前minSdkVersion
到API级别14的向后兼容性,但不高于此级别(因为您没有使用任何有争议的更高版本)
为什么我需要使用两个if语句?为什么第一个if语句不能满足两行代码的要求
可能是因为您为@TargetApi
注释选择了蜂巢
。如果我们在运行API级别14或更高的设备上,那么根据定义,我们在运行API级别11或更高的设备上。您不需要内部if
检查
是否有理由需要在两个位置检查构建,或者这可能是一个bug
我不知道你认为“两个地点”是什么。是否需要
@TargetApi
注释和外部if
检查?对如果检查,您是否需要这两个?不。如果您将@TargetApi
设置为冰淇淋三明治
,删除内部的if
检查,并获得Lint投诉,这可能是Android插件中的一个错误。在使用这两个if语句时,我没有使用TargetApi注释。我将使用最外层的if语句和targetAPI注释,或者使用两个if语句,但不能同时使用两个if语句和注释。我假设外部if语句将应用于if块内的所有内容。。?抱歉,“两个位置”指的是if语句,而不是if语句和注释。@cjaym13:“我假设外部if语句将应用于if块内的所有内容….?”--是的。好的,很好。至少我没有发疯,哈哈。我想这一定是某种原因造成的错误,如果一个代码段需要api 11,另一个代码段需要api 14,那么检查api 14或更高版本就足够了。在验证用户是否在api 14上之后,我必须检查api 11,这一事实在我看来是绝对荒谬的。。idk,我想我会把这个错误报告给Intellij,看看会发生什么。。谢谢你的帮助