switch case 语句错误:case 表达式必须是常量表达式

2022-08-31 08:17:31

我的开关案例声明昨天工作得很好。但是当我今天早上早些时候运行代码时,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 均以红色下划线标出。


答案 1

在常规 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

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

在 Eclipse
中,将光标移动到关键字,然后按 +,然后选择switchCtrl1

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

在 Android Studio 中
将光标移到关键字上,然后按 + 然后选择switchAltEnter

将“开关”替换为“如果”。


答案 2

取消选中项目“属性”中的“是库”对我有用。