现在的位置: 首页 > 综合 > 正文

【Android】项目工程作为Library引用时R文件只拿过常量没有final导致的switch报错case expressions must be constant expressions

2017年09月19日 ⁄ 综合 ⁄ 共 2215字 ⁄ 字号 评论关闭

我们都知道R文件中的值都是常量值都会有final修饰符:

public final class R {
	public static final class dimen {
		public static final int MainActivityMargin = 0x7f040000;
		public static final int MainActivityViewMargin = 0x7f040001;
	}
	public static final class drawable {
		public static final int ic_launcher = 0x7f020005;
		public static final int item_dir_list_back_icon = 0x7f020006;
		public static final int item_dir_list_icon = 0x7f020007;
	}
	public static final class id {
		public static final int item_dir_list_icon_iv = 0x7f060005;
		public static final int item_dir_list_name_tv = 0x7f060006;
		public static final int main_cancle_btn = 0x7f060003;
		public static final int main_dir_path_lv = 0x7f060001;
		public static final int main_dir_path_tv = 0x7f060000;
		public static final int main_select_btn = 0x7f060002;
	}
	public static final class layout {
		public static final int activity_dir_select = 0x7f030000;
		public static final int item_dir_list = 0x7f030002;
	}
	public static final class string {
		public static final int action_settings = 0x7f050002;
		public static final int app_name = 0x7f050000;
		public static final int hello_world = 0x7f050001;
	}
}

但是如果项目作为一个Library引用时,也就是右键项目文件夹----->Properties----->Android----->Library勾上了Is Library:


这时R文件中的常量值的final修饰符将会消失变成一个静态变量:

public final class R {
    public static final class attr {
    }
    public static final class dimen {
        /**  MainActivity 
         */
        public static int MainActivityMargin=0x7f040000;
        public static int MainActivityViewMargin=0x7f040001;
    }
    public static final class drawable {
        public static int ic_launcher=0x7f020000;
        public static int item_dir_list_back_icon=0x7f020001;
        public static int item_dir_list_icon=0x7f020002;
    }
    public static final class id {
        public static int item_dir_list_icon_iv=0x7f060004;
        public static int item_dir_list_name_tv=0x7f060005;
        public static int main_cancle_btn=0x7f060003;
        public static int main_dir_path_lv=0x7f060001;
        public static int main_dir_path_tv=0x7f060000;
        public static int main_select_btn=0x7f060002;
    }
    public static final class layout {
        public static int activity_dir_select=0x7f030000;
        public static int item_dir_list=0x7f030001;
    }
    public static final class string {
        public static int action_settings=0x7f050002;
        public static int app_name=0x7f050000;
        public static int hello_world=0x7f050001;
    }
}

但是其对应值是不会改变的,不过如果在项目中你用到switch来分支判断R文件中的常量值,如:

switch (v.getId()) {
case R.id.main_select_btn:
	
	break;
}

这时case可能就会报错:


原因是case表达式必须为一个常量值,而当项目作为引用时,R文件中的值从常量变为变量所以会报错,此时Google提供的一个方法就是把它转化为if-else语句,即在switch语句处 Ctrl+1 然后可以替换成if-else语句。

抱歉!评论已关闭.