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

标签 android api intellij-idea

我在观看关于属性动画的 android 开发者视频 ( https://www.youtube.com/watch?v=3UbJhmkeSig ) 时遇到了一个很容易解决但对我来说很难理解的问题,我希望有人能为我解答这个问题。

我有一个目标 list 中的 API 级别 8 的项目,因此当我使用下面的代码时,我收到一条错误消息,指出所使用的代码需要比当前目标 API 级别更高的 API 级别。作为解决方法,我在运行时检查构建版本 (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 语句中以确保是一个 block 而不是一行,但我的 IDE (IntelliJ IDEA) 仍然向我显示错误,指出代码行需要 API 11 和我的项目以 API 8 为目标。我的两个解决方案是将代码放入两个嵌套的 if 语句中,一个检查 API 14,另一个检查 API 11,或者使用

@TargetApi(Build.VERSION_CODES.HONEYCOMB)

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

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

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

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

非常感谢

最佳答案

Does @TargetAPI simply get rid the lint check or does it somehow effect the entire method and whether or not it compiles/runs?

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

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

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

Why was I required to use two if statements? Why didn't the first if statement suffice for both lines of code?

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

Is there a reason for needing to check the build at both locations or is this perhaps a bug?

我不知道您认为“两个位置”是什么。您是否需要 @TargetApi 注释和外部 if 检查?是的。您需要同时检查 if 吗?不。而且,如果您将 @TargetApi 设置为 ICE_CREAM_SANDWICH,删除内部 if 检查,并收到 Lint 投诉,这可能是Android 插件。

关于android - 当代码需要特定的 API 级别时,为什么对 Build.Version 的检查必须是相同的要求而不是达到或高于要求的级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26194497/

相关文章:

json - 如何从 Google Maps API 地理编码结果中过滤掉虚构的位置(例如 "under a rock"、 "hiding")?

java - 触发 Gradle 测试时无法使用 commons-exec 在 Java 中运行命令行

android - 如何停止或取消 Mediaplayer.setOnPreparedListener 表单执行 Android

java - 覆盖 ClassNames 函数而不创建扩展 ClassName 的新类

php - 从网站获取YouTube channel ID

java - NodeJS 和 Java 创建 REST API

java - 从Libs文件夹更改Gradle Compile .jar路径

java - 当 Intellij 模块作为依赖项包含在另一个模块中时,无法访问资源

android - 将 1000 的标记添加到 android Googlemap

android-manifest - 适用于平板电脑手机的 Android 应用程序