刚研究Android Studio,常常都是将Eclipse的项目导入到Android Studio中,在这个过程中,常常会遇到一些问题,在这里做一个笔记记录:
█ 问题重现:
● 代码:
public class TestDialog extends Dialog implements OnClickListener {
private TextView btnText1, btnText2;
public TestDialog(Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_myinputpass);
initUI();
}
private void initUI() {
btnText1 = (TextView)findViewById(R.id.button1_text);
btnText2 = (TextView)findViewById(R.id.button2_text);
btnText1.setOnClickListener(this);
btnText2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1_text:
break;
case R.id.button2_text:
break;
default:
break;
}
}
}
● 问题:
case expressions must be constant expressions 1 quick fix available: Migrate Android Code |
█ 问题原因:
● 该项目是库项目,被主项目所引用:
● 主要原因:
switch-case语句中的case只能使用常量,而当项目就设定为库项目(Is Library)时,在编译时,可以在R.java文件中看到所有的R.id.XXX 都是public static int修饰,也就是静态变量。 正常的主项目,在编译后生成的R.java文件中,都是 public final static int修饰的,即为常量,这个时候可使用switch-case语句。 |
█ 解决方法:
● 要么不要作为库项目,即将lib勾去掉,变成主项目,这样R.id.XXX 都变成常量,就可以用该语句。
● 要么就是将Switch语句换成if-else语句。if-else语句可以使用变量作为判定条件。这里是作为库项目使用,因此只能选择该种方法解决。
● 将Switch语句换成if-else语句可以使用Eclipse的自带工具实现,不需要手工一个个去修改,将鼠标点击到Switch位置,按下Ctrl+数字键1就会自动弹出提示。
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.button1_text) {
} else if (id == R.id.button2_text) {
} else {
}
}
● 值得注意的是,每个case 后都要加上break,否则按下Ctrl+数字键1将会提示:No suggestions available!
█ 相关资料:
- switch语句报错
● android switch语句报错:case expressions must be constant expressions
2. switch-case语句访问资源ID
● 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案
- 库项目中对R.id资源的引用方式