2014-10-04 64 views
3

我是看物业动画的Android开发者视频(https://www.youtube.com/watch?v=3UbJhmkeSig)当我跑进这是很容易解决,但我很难理解一个问题,希望有人能照一些轻于它的我..当代码需要特定的API级别时,为什么必须对Build.Version进行检查而不是要求相同或高于要求的级别?

我有一个针对清单中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版本。

@TargetAPI干脆干掉lint检查,还是以某种方式影响整个方法以及它是否编译/运行?

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

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

非常感谢

回答

2

是否@TargetAPI简单地摆脱皮棉支票或它在某种程度上影响整个方法,以及是否将其编译/运行?

这表明皮棉,对于注释(方法或类)的范围,皮棉应该把minSdkVersion为(例如,HONEYCOMB)在注释中提供的值,而不是不管你拥有它指定如在您的清单或build.gradle文件中。

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

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

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

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

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

我不知道你认为“两个地点”是什么。您是否需要@TargetApi注释和外部if检查?是。你需要两张if支票吗?否。并且,如果您将@TargetApi设置为ICE_CREAM_SANDWICH,请删除内部的if检查,并获得Lint投诉,这可能是Android插件中的一个错误。

+0

当使用两个if语句时,我没有使用targetapi注释。我会使用最外层的if语句和targetAPI注释或两个if语句,但不能同时使用两个if语句和注释。我假设外部if语句将适用于if块中的所有内容..?对不起,“两个地点”我的意思是两个if语句,而不是if语句和注释。 – cjayem13 2014-10-04 16:09:12

+0

@ cjayem13:“我是在假设外部if语句适用于if块内的所有内容??” - 它的确如此。 – CommonsWare 2014-10-04 16:09:57

+0

好的,那很好。至少我不会疯狂大声笑。我想这必须是某种类型的错误,如果一个代码段需要api 11,而另一个需要api 14,则检查api 14或更高版本应该足以满足这两个要求。事实上,我必须在验证用户后检查api 11是否在api 14上,这对我来说似乎是绝对荒谬的。idk,我想我会向Intellij报告错误,看看会发生什么..感谢您的帮助 – cjayem13 2014-10-04 16:12:45

相关问题