Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当代码需要特定的API级别时,为什么Build.Version的检查必须与所需的相同,而不是处于或高于所需的级别?_Android_Api_Intellij Idea - Fatal编程技术网

Android 当代码需要特定的API级别时,为什么Build.Version的检查必须与所需的相同,而不是处于或高于所需的级别?

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) {

我正在观看一个关于房地产动画的安卓开发者视频(),突然遇到了一个很容易解决但对我来说很难理解的问题,希望有人能为我解释一下

我有一个项目的目标是清单中的API级别8,因此当我使用下面的代码时,我得到一个错误,指出所使用的代码需要比当前目标API级别更高的API级别。作为一种解决方法,我在运行时()检查了构建版本,并且仅在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);
            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,看看会发生什么。。谢谢你的帮助