我的switch-case语句昨天运行得很好。但是当我今天早上早些时候运行代码时,eclipse给case语句加了红色的下划线,并告诉我: case表达式必须是常量表达式,它是常量,我不知道发生了什么。下面是我的代码:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
所有R.id.int都用红色下划线标出。
发布于 2013-11-06 20:15:20
取消选中项目Properties中的"Is Library“为我工作。
发布于 2012-02-01 16:20:49
R.id.*,因为ADT 14没有更多地声明为最终的静态int,所以您不能在switch case构造中使用。您可以改用if else子句。
发布于 2014-03-11 19:21:37
另一种解决方案如何保持良好的开关,而不是if-else:
private enum LayoutElement {
NONE(-1),
PLAY_BUTTON(R.id.playbtn),
STOP_BUTTON(R.id.stopbtn),
MENU_BUTTON(R.id.btnmenu);
private static class _ {
static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
}
LayoutElement(int id) {
_.elements.put(id, this);
}
public static LayoutElement from(View view) {
return _.elements.get(view.getId(), NONE);
}
}
所以在你的代码中你可以这样做:
public void onClick(View src) {
switch(LayoutElement.from(src)) {
case PLAY_BUTTTON:
checkwificonnection();
break;
case STOP_BUTTON:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case MENU_BUTTON:
openOptionsMenu();
break;
}
}
枚举是静态的,因此影响非常有限。唯一需要关注的窗口是涉及的双重查找(首先在内部SparseArray上,然后在交换表上)
也就是说,如果需要,通过保留对id的引用,还可以使用此枚举以流畅的方式获取项。但这是另一个时间的故事。
https://stackoverflow.com/questions/9092712
复制相似问题