2014-01-08 17 views
16

我們有一個多項目應用程序,我們正在轉向gradle。在Java編譯錯誤,構建結果一樣:什麼原因導致switch語句中生成的R.id.xxx值出現「需要常量表達式」錯誤?

AFragment.java:159: constant expression required 
     case R.id.aBtn: 

我們已經證實,在錯誤報告的常數在生成R.java

一個線索是,錯誤只適用於開關值。例如,使用findViewById(R.id.aBtn)沒有錯誤。

還注意到,常量來自主項目,而不是圖書館項目之一。

對於任何想要擺脫錯誤的人,laalto的建議將會解決它。

他提供的鏈接以及eclipse沒有顯示使用gradle構建時發生的錯誤的事實給了我另一個線索。 eclipse生成的R.java將主要項目常量定義爲'final',但是gradle生成的值不是'final'。真正的解決方案必須在糾正gradle構建文件。

SOLUTION(2014年1月9日)

我們對應用的build.gradle是採用了Android庫插件,而不是Android插件的。它是這樣的:

應用插件:「Android的圖書​​館

將其更改爲這樣:

應用插件: '機器人'

解決了這一問題。

+3

而導致此錯誤的代碼是....? –

+0

它是一個庫項目還是一個常規的Android項目? – PopoFibo

回答

5

如果您使用來自庫項目的資源,會發生這種情況。在這種情況下,R類中的ID不是真正的常量,因此不能在switch語句中使用。

+0

所以你可以請解釋如何解決這個問題,因爲在主要問題中更換插件沒有解決我的問題 –

25

庫項目資源標識符不是常量static final int s,只是static int s。

將需要切換庫資源ID的代碼轉換爲if - else結構。

更多閱讀:http://tools.android.com/tips/non-constant-fields

+0

它必須是別的東西,因爲所報告的常量實際上是公共靜態final int,因爲它們是主項目的一部分,不是圖書館項目。 – user3174822

+0

如果這不能解決問題,請考慮在問題中添加您的構建設置的其他詳細信息。 – laalto

+0

這不是別的。它是開發環境版本的一個函數,不管它是主項目還是庫項目都沒關係..所有R資源標識符都沒有聲明爲最終的。你只需要將開關移動到ann if-else結構 – dangVarmit

相關問題