是什么导致 switch 语句中生成的 R.id.xxx 值出现"constant expression required"错误?



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

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构建文件。

解决方案(2014-01-09)

我们的应用程序build.gradle应用了android库插件,而不是android插件。是这样的:

应用插件:"android库">

将其更改为:

应用插件:"android">

解决了问题。

库项目资源标识符不是恒定的static final ints,只是static ints。

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

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

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

相关内容

最新更新