在开关盒中使用字符串作为菜单?

Dar*_*ren 3 java android switch-statement

我正在为一个论坛制作一个应用程序,我正在添加一个收藏夹部分,您可以在其中添加您喜欢的部分以便快速访问.我有一个菜单设置,其中包含不同部分的列表,所以我所做的是制作一个开关盒来决定在按下某个菜单项时要做什么,在本例中是该部分.通过这样做,我了解到你不能使用带开关盒的琴弦,所以我的问题是我怎么能解除按下哪个按钮并根据按下哪个按钮做一个动作?

这是我的菜单代码:

public class Menu extends ListActivity{

String[] classes = {"Home", "Gaming", "Microsoft Consoles", 
        "Sony Consoles", "Other Platforms", "Tech Center", "General"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    switch (classes) {
    case "Home":

    break; 
    case "Gaming".hashCode(): 

    break; 
    }   
}
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,因为类是一个String [],我不能用switch开关案例,所以有没有办法做到这一点,或者另类?

dar*_*ioo 8

在Java 7中添加了switch语句中的字符串.例如,请看这里.由于Android开发目前不基于Java 7语法,因此您必须采用备用路由.这意味着:if-else语句.他们不是最漂亮的,但他们会完成工作.

  • @Darren就个人而言,我发现枚举或命令模式实现更清晰,更易于维护. (2认同)

Kni*_*edi 6

这是一个很好的,干净的解决方法:

public enum Classes {
    HOME("Home"),
    GAMING("Gaming"),
    ...
    MICROSOFT_CONSOLES("Microsoft Consoles");

    private final String name;

    Classes(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以切换枚举并在适配器中以这种方式使用它:

new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, Classes.values())
Run Code Online (Sandbox Code Playgroud)

更新

唯一的问题是这些字符串是硬编码的.为了解决这个问题,我建议实现一个静态的Application上下文帮助器并实现enum这样的(这是一个想法,我没有尝试过,但它应该工作):

public enum Classes {
    HOME(R.string.home),
    GAMING(R.string.gaming),
    ...
    MICROSOFT_CONSOLES(R.string.microsoft_consoles);

    private final int name;

    Classes(int name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return App.getContext().getString(name);
    }
}
Run Code Online (Sandbox Code Playgroud)