问题描述:
当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下错误,报的错误是case分支后面跟的参数必须是常数。
原因分析:
出现这个问题的原因是Android library中生成的R.java中的资源ID不是常数。
在library中这样写:
打开library中的R.java,发现确实如此,每一个资源ID都没有被声明为final:
在正常工程,非library工程中,资源ID被声明为final:
解决方案:
既然是由于library的R.java中的资源ID不是常量引起的,我们可以在library中通过if-else-if条件语句来引用资源ID,这样就避免了这个错误:
原因溯源:
合并多个library项目时,字段的实际值(必须唯一)可能会发生冲突。在ADT 14之前,所有字段都是最终字段,因此,所有library在使用时都必须与主项目一起重新编译其所有资源和关联的Java代码。这对性能不利,因为它使构建速度非常慢。它还阻止分发不包含源代码的library项目,从而限制了library项目的使用范围。
字段不再是final的原因是,这意味着库jar可以被编译一次并直接在其他项目中重用。除了允许分发库项目的二进制版本(r15中提供)之外,这还使构建速度更快。
switch语句要求所有大小写标签(例如)R.id.button1在编译时都是常量(这样,值可以直接复制 到.class文件中)。
解决方案很简单:将switch语句转换为if-else语句。幸运的是,这在Eclipse中非常容易。只需将插入符号放在switch关键字上,然后按Ctrl-1(或在Mac上为Cmd-1):
Android Studio快捷键switch case 轻松转换为if else
选中“switch”,ALt+Enter(或在Mac上为Option+Return)同时选中,弹出对话框,选择“Replace 'switch' with 'if'”,
选中之后,点击,即可将“switch”转换为了'if'样式,如果需要转回“switch”,同样的快捷键方式,轻松转换。