开关case语句错误:caseexpression式必须是常量expression式

我的switch-case语句昨天工作得很好。 但是当我今天早上运行代码的时候,eclipse给了我一个红色的case语句的错误,并且说:caseexpression式必须是常量expression式,它是常量,我不知道发生了什么。 这是我的代码如下:

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都以红色标出。

在一个常规的Android项目中,资源R类中的常量声明如下:

 public static final int main=0x7f030004; 

但是,从ADT 14开始,在一个图书馆项目中,他们将被这样宣布:

 public static int main=0x7f030004; 

换句话说,常量在图书馆项目中并不是最终的。 因此你的代码将不再编译。

解决scheme很简单:将switch语句转换为if-else语句。

 public void onClick(View src) { int id = src.getId(); if (id == R.id.playbtn){ checkwificonnection(); } else if (id == 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(" "); } else if (id == R.id.btnmenu){ openOptionsMenu(); } } 

http://tools.android.com/tips/non-constant-fields

您可以使用以下命令快速将switch语句转换为if-else语句:

在Eclipse中
将光标移至switch关键字,然后按Ctrl + 1,然后select

将“开关”转换为“if-else”。

在Android Studio中
将光标移至switch关键字,然后按Alt + Enter,然后select

用'if'replace'switch'。

在项目属性中取消选中“Is Library”为我工作。

R.id. *,因为ADT 14没有更多的声明为final static int,所以你不能在switch case构造中使用。 你可以使用if else子句。

这个问题的简单解决scheme是:

点击开关 ,然后按下CTL + 1,它会将你的开关切换到if-else语句,并解决你的问题

如何保持这个好的开关,而不是一个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上,后来在切换表上)

也就是说,这个枚举也可以被用来以stream利的方式获取物品,如果需要通过保持对id的引用…但是这是一个其他时间的故事。

解决scheme可以这样做:

  1. 只需 分配整数
  2. 使variables 最终

例:

 public static final int cameraRequestCode = 999; 

希望这会帮助你。

当我在我的类中声明的variables的函数中使用开关时,它引发了这个错误:

 private void ShowCalendar(final Activity context, Point p, int type) { switch (type) { case type_cat: break; case type_region: break; case type_city: break; default: //sth break; } } 

当我在课程开始时向variables声明final时,问题就解决了:

 final int type_cat=1, type_region=2, type_city=3; 

我想提一下,当我尝试在我的项目中添加一个库时遇到了同样的情况。 突然之间所有的开关语句开始显示错误!

现在我试图删除我添加的库,即使这样做没有工作。 如何“ 当我清理项目 ”所有的错误刚刚熄灭!