弹出菜单正在累积出现(未正确关闭)
Popup menu is accumulating occurrences (not dismissing properly)
我的应用程序中有一个奇怪的错误。我有一个 RecyclerView,其中包含带有溢出菜单图标的列表项。见下文。enter image description here
当我触摸菜单外部(取消它)时出现问题。下次我 select 菜单时,它会呈现 2 个菜单。在我完成动作时,这种情况会持续多次。见下文。
enter image description here
我不明白为什么会这样。这是我在 ViewHolder 的列表项中显示菜单的代码:
final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);
mOptionsMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
Menu menu = popupMenu.getMenu();
MenuItem edit = menu.findItem(R.id.edit);
MenuItem delete = menu.findItem(R.id.delete);
MenuItem dq = menu.findItem(R.id.dq);
MenuItem undoDq = menu.findItem(R.id.undo);
// change options if this competitor is DQ
if (competitor.getStatus() == Status.DQ) {
edit.setVisible(false);
delete.setVisible(false);
dq.setVisible(false);
undoDq.setVisible(true);
}
popupMenu.show();
}
});
这是我的代码,用于 selected 菜单项:
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
FragmentManager manager = getActivity().getSupportFragmentManager();
switch (item.getItemId()) {
case R.id.edit:
// todo finish this
// Intent intent = CompetitorInMatchForm.editIntent(mContext, competitor, true);
// startActivity(intent);
break;
case R.id.delete:
CompetitorStatusInMatchDialog deleteDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "delete", getAdapterPosition());
deleteDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
deleteDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
case R.id.dq:
CompetitorStatusInMatchDialog dqDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "dq", getAdapterPosition());
dqDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
dqDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
case R.id.undo:
CompetitorStatusInMatchDialog undoDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "undo", getAdapterPosition());
undoDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
undoDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
default:
popupMenu.dismiss();
}
return true;
}
});
任何帮助确定为什么对话框会累积菜单出现的帮助都是 great.I 以前使用弹出菜单没有这个问题。我希望当您触摸菜单外部时它会被取消。
那是因为您在 onClick 侦听器中扩充了菜单,因此每次显示菜单时实际上都添加了所有元素。
如果您期望 dismiss
会从菜单中删除项目,那是错误的:它只会隐藏弹出窗口。
您可以将此行移到侦听器之外:
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
像这样:
final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
我的应用程序中有一个奇怪的错误。我有一个 RecyclerView,其中包含带有溢出菜单图标的列表项。见下文。enter image description here
当我触摸菜单外部(取消它)时出现问题。下次我 select 菜单时,它会呈现 2 个菜单。在我完成动作时,这种情况会持续多次。见下文。 enter image description here
我不明白为什么会这样。这是我在 ViewHolder 的列表项中显示菜单的代码:
final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);
mOptionsMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
Menu menu = popupMenu.getMenu();
MenuItem edit = menu.findItem(R.id.edit);
MenuItem delete = menu.findItem(R.id.delete);
MenuItem dq = menu.findItem(R.id.dq);
MenuItem undoDq = menu.findItem(R.id.undo);
// change options if this competitor is DQ
if (competitor.getStatus() == Status.DQ) {
edit.setVisible(false);
delete.setVisible(false);
dq.setVisible(false);
undoDq.setVisible(true);
}
popupMenu.show();
}
});
这是我的代码,用于 selected 菜单项:
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
FragmentManager manager = getActivity().getSupportFragmentManager();
switch (item.getItemId()) {
case R.id.edit:
// todo finish this
// Intent intent = CompetitorInMatchForm.editIntent(mContext, competitor, true);
// startActivity(intent);
break;
case R.id.delete:
CompetitorStatusInMatchDialog deleteDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "delete", getAdapterPosition());
deleteDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
deleteDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
case R.id.dq:
CompetitorStatusInMatchDialog dqDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "dq", getAdapterPosition());
dqDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
dqDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
case R.id.undo:
CompetitorStatusInMatchDialog undoDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "undo", getAdapterPosition());
undoDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
undoDialog.show(manager, DELETE_COMP_FROM_MATCH);
break;
default:
popupMenu.dismiss();
}
return true;
}
});
任何帮助确定为什么对话框会累积菜单出现的帮助都是 great.I 以前使用弹出菜单没有这个问题。我希望当您触摸菜单外部时它会被取消。
那是因为您在 onClick 侦听器中扩充了菜单,因此每次显示菜单时实际上都添加了所有元素。
如果您期望 dismiss
会从菜单中删除项目,那是错误的:它只会隐藏弹出窗口。
您可以将此行移到侦听器之外:
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
像这样:
final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);