2010-06-19 2 views
2

Я добавил пользовательское меню на кнопку меню, используя следующий код раз:меню может быть нажата только

@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() { 

    } 
} 

Это работает правильно, если я нажму кнопку меню в первый раз. Но если контекстное меню закрыто, и я дважды нажимаю кнопку меню, ничего не происходит.

Я также попытался вызвать

alert.close(), alert.hide(), alert.dismiss(), и т.д. в методе закрытия(), но это не улучшает ситуацию. любые подсказки? благодаря!

+3

Я нашел ответ сам: я должен переписать (меню Menu) общественного булева onPrepareOptionsMenu вместо (меню Меню публичного булевой onCreateOptionsMenu) – 2010-06-19 12:46:22

ответ

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

    } 
} 
Смежные вопросы