Switch case 语句错误: 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 都用红色下划线标记。

140431 次浏览

瑞德。* ,因为 ADT 14没有更多地声明为 final static int,所以不能在 switch case 结构中使用。您可以使用 if else 子句代替。

在一个常规的 Android 项目中,资源 R 类中的常量是这样声明的:

public static final int main=0x7f030004;

然而,从 ADT 14开始,在一个图书馆项目中,它们将像这样声明:

public static int main=0x7f030004;

换句话说,常量在库项目中不是 final 的。 因此,您的代码将不再编译。

解决方案很简单: 将 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,然后选择

将“ switch”转换为“ if-else”。

在 Android Studio 中
将光标移动到 switch关键字,然后按 Alt + Enter,然后选择

用“如果”代替“切换”。

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

现在我试图删除我添加的库,即使当时它也没有工作。 怎么“ 在我清理项目的时候”所有的错误都消失了!

当我在一个函数中使用 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;

在项目 Properties 中取消选中“ Is Library”对我有用。

还有一个办法可以保留这个漂亮的开关,而不是 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 的引用... 但那是另一个时间的故事。

解决这个问题的简单方法是:

单击 开关,然后按 CTL + 1,,它会将您的开关更改为 if-else 块语句,并将解决您的问题

解决办法可以这样做:

  1. 价值整数
  2. 变量调到 期末考试

例如:

public static final int cameraRequestCode = 999;

希望这个能帮到你。

只需将变量声明为 期末考试