在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

问题描述:

当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下错误,报的错误是case分支后面跟的参数必须是常数。

资源ID需要是常数

原因分析:

出现这个问题的原因是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”,同样的快捷键方式,轻松转换。

你可能感兴趣的:(在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案)