代码之家  ›  专栏  ›  技术社区  ›  anon

菜单按钮只能单击一次

  •  2
  • anon  · 技术社区  · 14 年前

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

    @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.disclose()等,但不会改善情况。有什么暗示吗?谢谢!

    1 回复  |  直到 14 年前
        1
  •  3
  •   RoflcoptrException    14 年前

    由于近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()));
                }
            }
    
        }
    }