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

时间:2011-10-01 13:27:11

标签: 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; 
    }   
}
}

我收到一个错误,因为classes是一个String [],我不能在switch case中使用它,那么有没有办法做到这一点,或者另类呢?

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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;
    }
}

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

new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, Classes.values())

<强>更新

唯一的问题是这些字符串是硬编码的。要解决这个问题,我建议实施一个static Application context helper并像这样实现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);
    }
}

答案 2 :(得分:1)

更好的解决方案:

一个枚举类:

public enum Tabs 
{
 Home, 
 Gaming, 
 Microsoft_Consoles, 
 Sony_Consoles, 
 Other_Platforms, 
 Tech_Center, 
 General
}

在另一个班级:

 switch (classes)
 {
   case Home:

   break;
 ...
 }

@override枚举选项卡的toString()类做得很好。