Android AlertDialog.Builder - 好的 OnClickListener 项目 ID 实践?

Android AlertDialog.Builder - good OnClickListener item id practice?

假设我想使用 AlertDialog.Builder 创建一个简单的对话框。有没有什么好的方法可以在它的 OnClickListener 中摆脱与整数的书面 "by hand" 比较?

我可以做一些常量,但如果有人向菜单添加另一个项目,它仍然需要在 2 个地方进行更改。

final CharSequence[] menuOptions = new CharSequence[]{"one","two","three"};
AlertDialog.Builder builder = new AlertDialog.Builder(MapBrowsingActivity.this);
builder.setTitle("Choose action").
        setItems(menuOptions, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    //do sth;
                }
                if (which == 1) {
                    //do sth;
                }
                if (which == 2) {
                    //do sth;
                }
            }
        });
builder.create().show();

您可以使用基于 enum 用法的下一个方法。它需要将 enum 转换为 CharSequence 的额外内容,但保证当您或其他开发人员将 add/remove/insert 新菜单应用程序正常工作时。

private void showMenu() {
    final Menu[] values = Menu.values();
    CharSequence[] items = new CharSequence[values.length];
    for (int i = 0; i < values.length; i++) {
        items[i] = values[i].toString();
    }
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Choose action").
            setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Menu value = values[which];
                    switch (value) {
                        case Menu1:
                            break;
                        case Menu2:
                            break;
                        case Menu3:
                            break;
                    }
                }
            });
    builder.create().show();
}

private enum Menu {
    Menu1,
    Menu2,
    Menu3
}

你真的无能为力。如果有人更改菜单项,则处理方式也应更改。不过,您可以使用 switch 使其更清晰:

switch(what) {
    case 0:
        //do sth;
        break;

    case 1:
        //do sth;
        break;

    case 2:
        //do sth;
        break;

    default:
        throw new RuntimeException("item unknown");
}