2014-10-04 58 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

相關問題