首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >switch case语句错误: case表达式必须是常量表达式

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

Stack Overflow用户
提问于 2012-02-01 16:15:44
回答 4查看 130.8K关注 0票数 133

我的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都用红色下划线标出。

EN

回答 4

Stack Overflow用户

发布于 2013-11-06 20:15:20

取消选中项目Properties中的"Is Library“为我工作。

票数 52
EN

Stack Overflow用户

发布于 2012-02-01 16:20:49

R.id.*,因为ADT 14没有更多地声明为最终的静态int,所以您不能在switch case构造中使用。您可以改用if else子句。

票数 8
EN

Stack Overflow用户

发布于 2014-03-11 19:21:37

另一种解决方案如何保持良好的开关,而不是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的引用,还可以使用此枚举以流畅的方式获取项。但这是另一个时间的故事。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9092712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档