提问者:小点点

是什么原因导致开关语句中生成的R.id.xxx值出现“需要常量表达式”错误?


我们有一个多项目应用程序,我们正在迁移到gradle。构建会导致Java编译错误,例如:

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

我们已经确认错误中报告的常量在生成的R.java中。

一个线索是错误仅适用于开关值。例如,使用findViewById(R.id. aBtn)没有错误。

另请注意,常量来自主项目,而不是库项目之一。

对于任何想摆脱错误的人来说,拉尔托的建议都会解决这个问题。

他提供的链接,以及eclipse不显示使用gradle构建时发生的错误的事实给了我另一个线索。eclipse生成的R.java将主项目常量定义为“最终”,但gradle生成的值不是“最终”。真正的解决方案必须是纠正gradle构建文件。

解决方案(2014-01-09)

我们用于该应用程序的build. gradle正在应用android-Library插件而不是android插件。是这样的:

应用插件:“Android库”

将其更改为:

应用插件:“android”

修复了问题。


共2个答案

匿名用户

库项目资源标识符不是常量静态最终ints,只是静态ints。

将需要打开库资源id的代码转换为if-else结构。

进一步阅读:http://tools.android.com/tips/non-constant-fields

匿名用户

如果您使用Library项目中的资源,就会发生这种情况。在这种情况下,R类中的id不是真正的常量,因此不能在switch语句中使用。