@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()等,但是并不能改善这种情况.有什么提示吗?谢谢!
最佳答案
由于将近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()));
}
}
}
}