菜单按钮只能单击一次

时间:2010-06-19 12:28:43

标签: android

我使用以下代码在菜单按钮中添加了自定义菜单:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        if (getDisplayedView() instanceof WorkspaceView) {
            ((WorkspaceView) getDisplayedView()).showEditMenu();
        }
        return true;
    }

public void showEditMenu() {
        new EditMenu(lexs, ((Project) projects.getSelectedItem()).getName(), ((ProjectList) projectsList.getSelectedItem()).getName()).show();
    }

EditMenu通过以下方式实现:

public class EditMenu {

    private final String DELETE_PROJECT = "Projekt löschen";
    private final String DELETE_LIST = "Liste löschen";
    private final String RENAME_PROJECT = "Projekt umbenennen";
    private final String RENAME_LIST = "Liste umbenennen";
    private final String CLOSE = "Menü schliessen";

    private Context context;
    private String projectName;
    private String listName;
    private AlertDialog alert;

    private final CharSequence[] items = {DELETE_PROJECT, DELETE_LIST, RENAME_PROJECT, RENAME_LIST, CLOSE};

    public EditMenu(Context context, String projectName, String listName) {
        this.context = context;
        this.projectName = projectName;
        this.listName = listName;
    }

    public void show() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(projectName + ": " + listName);
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (items[item].equals(DELETE_PROJECT)) {
                    deleteProject();
                } else if (items[item].equals(DELETE_LIST)) {
                    deleteList();
                } else if (items[item].equals(RENAME_PROJECT)) {
                    renameProject();
                } else if (items[item].equals(RENAME_LIST)) {
                    renameList();
                } else if (items[item].equals(CLOSE)) {
                    close();
                }
            }
        });
        alert = builder.create();
        alert.show();
    }

    private void deleteProject() {

    }

    private void deleteList() {

    }

    private void renameProject() {

    }

    private void renameList() {

    }

    private void close() {

    }
}

如果我第一次点击菜单按钮,这项工作正常。但如果关闭上下文菜单并再次单击菜单按钮,则不会发生任何事情。

我也试过打电话

方法close()中的

alert.close(),alert.hide(),alert.dismiss()等,但它没有改善这种情况。任何提示?谢谢!

1 个答案:

答案 0 :(得分:3)

由于近3周内没有其他答案,我将自己回答我的问题:

而不是覆盖

public boolean onCreateOptionsMenu(Menu menu)

必须覆盖

public boolean onPrepareOptionsMenu(Menu menu)

这是一个简短的例子:

在活动中有以下代码:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        showMenu();
        return true;
}

private void showMenu() {
        EditMenu menu = new EditMenu(this, "Pacman Menu");
        menu.show();
}

然后clsas EditMenu以下列方式查找:

public class EditMenu {

    private final String QUIT = "Quit";
    private final String RESTART = "New Game";
    private final String SOUND = "Switch Sound";
    private final String PAUSE = "Un/pause";
    private final CharSequence[] items = new CharSequence[] {QUIT, RESTART, SOUND, PAUSE};

    private Context context;
    private String title;
    private AlertDialog alert;
    private MenuListener listener = new MenuListener();

    public EditMenu(Context context, String title) {
        this.context = context;
        this.title = title;
    }

    public void show() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(R.drawable.splashscreen);
        builder.setTitle(title);
        builder.setItems(items, listener);
        alert = builder.create();
        alert.show();
    }

    private class MenuListener implements DialogInterface.OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals(QUIT)) {
                ((PacmanGame) context).quitGame();
            } else if (items[item].equals(RESTART)) {
                ((PacmanGame) context).restart();
            } else if (items[item].equals(SOUND)) {
                Sound.setSoundOn(! Sound.isSoundOn());
            } else if (items[item].equals(PAUSE)) {
                ((PacmanGame) context).getGameBoard().setPausing(!(((PacmanGame) context).getGameBoard().isPaused()));
            }
        }

    }
}