序言:这个问题已经很过时了,它是在首选的Android开发环境是带有Android插件的Eclipse时编写的。
我有一段时间做了一个Java Android项目。今天,我更新了Android开发工具到谷歌的最新版本。而且项目坏了--我得到了一堆“case表达式必须是常量表达式”的编译错误信息。
结果发现R.java文件现在以不同的方式生成。以前,它会有一堆
public static final int MyID=0x12340000;
字符串
语句;现在,它看起来(在清理/重建之后)如下所示:
public static int MyID=0x12340000;
型final
不见了。所以我所有的资源ID上的开关(我有几个)都是错误的。发生什么事了是我吗?这有什么道理?有记录吗?我能以某种方式恢复final
吗?
7条答案
按热度按时间wa7juj8i1#
这发生在昨天,当SDK/ADT 14发布时:
从ADT 14开始,库项目中的资源常量不再是final的。这在http://tools.android.com/tips/non-constant-fields中有更详细的说明
ADT 14提供了一个快速修复程序:http://tools.android.com/recent/switchstatementconversion的
引用理由:
组合多个库项目时,字段的实际值(必须是唯一的)可能会发生冲突。在ADT 14之前,所有字段都是final字段,因此,所有库都必须在主项目中重新编译它们的所有资源和相关的Java代码。这对性能不利,因为它使构建非常缓慢。它还防止分发不包含源代码的库项目,从而限制了库项目的使用范围。
字段不再是final的原因是,这意味着库jar可以编译一次,并直接在其他项目中重用。除了允许发布库项目的二进制版本(在r15中),这使得构建速度更快。
4dc9hkyq2#
只需添加括号:
字符串
kokeuurv3#
你可以切换到使用If/Else语句,警告就会消失。
样品:
字符串
wb1gzix04#
Google建议您使用if/else条件
http://tools.android.com/tips/non-constant-fields
要自动更改它们,您可以将插入符号放在
switch
关键字上,然后在Windows上按Alt + Enter(在Mac上按Option + Enter)并选择将'switch'替换为'if'x0fgdtte5#
你应该使用view binding!
字符串
dfuffjeb6#
这是因为在新的AGP版本中,Google使所有rescours id非最终,在项目根目录下的
gradle.properties
文件中添加android.nonFinalResIds=false
,以确保AGP生成最终res id将使您避免修改代码。7kqas0il7#
只需要在你的模块级
build.gradle
文件中添加这个片段:字符串
更多:https://developer.android.com/studio/write/lint#gradle