如何根据条件隐藏/显示PopupMenu特定项?现有代码未达预期
嘿,我看你现在没法按预期控制PopupMenu里的菜单项显示隐藏,问题根源在于代码执行顺序不对,而且缺少显式的可见性控制逻辑——你先获取了menu对象再去加载菜单,这时候拿到的menu是空的,自然没法修改;另外你只在点击菜单项时做了判断,没在菜单显示前就调整状态。
给你整理了修正后的方案:
1. 调整代码顺序,正确控制菜单状态
你得先加载菜单资源,再获取有效的Menu实例,接着根据业务条件设置菜单项的可见性,最后再显示PopupMenu。这样菜单在弹出前就已经按你的要求调整好了。
修改后的代码如下:
PopupMenu popup = new PopupMenu(TableActivity.this, view); // 先设置点击监听器,一次就够,别重复设置哈 popup.setOnMenuItemClickListener(TableActivity.this); // 先把菜单资源加载到PopupMenu里 popup.inflate(R.menu.popup_shift); // 现在才能拿到可用的Menu实例 Menu menu = popup.getMenu(); // 找到你要控制的目标菜单项,比如合并菜单 MenuItem mergeMenuItem = menu.findItem(R.id.menu_merge); // 根据你的业务条件设置显示/隐藏 if (tableDbList.get(positionShift).getMergeTableId() == 0) { // 这里根据需求调整,要显示就设true,隐藏就设false mergeMenuItem.setVisible(true); } else { mergeMenuItem.setVisible(false); } // 最后弹出菜单 popup.show();
2. 去掉重复的监听器设置
你原来的代码里两次调用了popup.setOnMenuItemClickListener(this);,这完全没必要,重复设置可能会导致奇怪的逻辑冲突,留一次就好。
补充说明
如果之后数据有更新,每次弹出PopupMenu都要重复这个流程——重新加载菜单、判断条件、设置可见性,这样才能保证菜单状态和当前数据完全匹配。
这样改完之后,PopupMenu弹出时就会自动根据你的条件显示或隐藏指定菜单项啦。
内容的提问来源于stack exchange,提问作者Ujjwal Manandhar
相关产品推荐
相关产品推荐

