![](/img/trans.png)
[英]Switch statement eclipse error: case expressions must be constant expressions
[英]switch case statement error: case expressions must be constant expression
我的 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 都标有红色下划线。
在常规的 Android 项目中,资源 R 类中的常量声明如下:
public static final int main=0x7f030004;
但是,从 ADT 14 开始,在库项目中,它们将像这样声明:
public static int main=0x7f030004;
换句话说,常量在库项目中不是最终的。 因此,您的代码将不再编译。
解决方案很简单:将 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
语句:
在日食中
将光标移动到switch
关键字并按Ctrl + 1然后选择
将“开关”转换为“if-else”。
在 Android Studio 中
将光标移动到switch
关键字并按Alt + Enter然后选择
将“开关”替换为“如果”。
在项目属性中取消选中“是库”对我有用。
解决方法可以是这样:
例子:
public static final int cameraRequestCode = 999;
希望这会帮助你。
这个问题的简单解决方案是:
单击开关,然后按CTL+1,它会将您的开关更改为 if-else 块语句,并将解决您的问题
R.id.*,因为 ADT 14 不再被声明为 final static int,所以你不能在 switch case 构造中使用。 您可以改用 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 上,然后在切换表上)
也就是说,如果需要,通过保留对 id 的引用,此枚举也可用于以流畅的方式获取项目……但这是其他时间的故事。
当我在类中声明变量的函数中使用 switch 时,它抛出了这个错误:
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;
}
}
当我在类的开头对变量声明final
时,问题就解决了:
final int type_cat=1, type_region=2, type_city=3;
我想提一下,当我尝试在我的项目中添加一个库时,我遇到了同样的情况。 突然间所有的 switch 语句开始显示错误!
现在我试图删除我添加的库,即使那样也不起作用。 如何“当我清理项目时”所有错误都消失了!
只需将变量声明为final
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.