开关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可以这样做:
- 只需将 值 分配给整数
- 使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;
我想提一下,当我尝试在我的项目中添加一个库时遇到了同样的情况。 突然之间所有的开关语句开始显示错误!
现在我试图删除我添加的库,即使这样做没有工作。 如何“ 当我清理项目 ”所有的错误刚刚熄灭!