今天在将android工程模块化(也就是将工程作为library)的时候,有个switch语句是这样写的:
红线部分报出了异常,但是其它地方照样可以正常使用R文件,引用里面的id。
疑惑之下看了看R文件中的内容,一个被定义为library的工程中R文件的id如下:
public static int call_dialog_in=0x7f040000;
public static int call_dialog_out=0x7f040001;
public static int dialog_in=0x7f040002;
public static int dialog_out=0x7f040003;
public static int enter_left_to_right=0x7f040004;
public static int enter_right_to_left=0x7f040005;
public static int exit_left_to_right=0x7f040006;
public static int exit_right_to_left=0x7f040007;
public static int from_top_in=0x7f040008;
public static int from_top_out=0x7f040009;
public static int in_righttoleft=0x7f04000a;
public static int out_righttoleft=0x7f04000b;
public static int scale_in=0x7f04000c;
public static int scale_out=0x7f04000d;
在将该工程的libiary属性取消之后,也就是将工程android属性中的is library去掉再clean之后,再看看R文件的id定义,变成如下:
public static final int call_dialog_in=0x7f040000;
public static final int call_dialog_out=0x7f040001;
public static final int dialog_in=0x7f040002;
public static final int dialog_out=0x7f040003;
public static final int enter_left_to_right=0x7f040004;
public static final int enter_right_to_left=0x7f040005;
public static final int exit_left_to_right=0x7f040006;
public static final int exit_right_to_left=0x7f040007;
public static final int from_top_in=0x7f040008;
public static final int from_top_out=0x7f040009;
public static final int in_righttoleft=0x7f04000a;
public static final int out_righttoleft=0x7f04000b;
public static final int scale_in=0x7f04000c;
public static final int scale_out=0x7f04000d;
对比一下就可以发现不是library的工程中id定义多了final属性,这就是问题出现的关键地方了。
修改方案就简单了,switch语句中不使用id作为case,或者需要这样用的部分不作为library使用。