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

cja*_*m13 5 api android 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

 ObjectAnimator rotateAnimation = ObjectAnimator.ofFloat(resp1, View.ROTATION, 270);
Run Code Online (Sandbox Code Playgroud)

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

            rotateAnimation.setRepeatCount(0);
Run Code Online (Sandbox Code Playgroud)

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

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
Run Code Online (Sandbox Code Playgroud)

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

-@TargetAPI 是简单地摆脱 lint 检查还是以某种方式影响整个方法以及它是否编译/运行?

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

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

非常感谢

Com*_*are 2

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

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

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

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

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

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

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

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