Android Java 实现点击Popup Menu菜单项后动态重排菜单顺序
实现方案
核心逻辑
每次点击菜单项后,先将所有菜单项信息随机打乱,再清空原有菜单,按打乱后的顺序重新添加菜单项即可,具体实现代码如下:
Kotlin 实现
1. 预先定义菜单项原始数据
和你提供的XML配置对应即可:
// 存储菜单项的ID和标题对应关系 private val originMenuItems = listOf( R.id.yellow to "Yellow", R.id.red to "Red", R.id.blue to "Blue", R.id.green to "Green" ) // 如果需要下次弹出菜单时保留上次打乱的顺序,额外定义一个可变列表存储当前顺序 private var currentMenuItems = originMenuItems
2. PopupMenu 初始化与点击逻辑
// 替换为你触发弹出菜单的控件,比如按钮 showPopupBtn.setOnClickListener { val popup = PopupMenu(this@MainActivity, showPopupBtn) // 首次加载可选择加载原始XML,或者直接用打乱后的列表生成 popup.menuInflater.inflate(R.menu.你的菜单XML文件名, popup.menu) popup.setOnMenuItemClickListener { menuItem -> // 这里写你自己的菜单项点击业务逻辑 Toast.makeText(this@MainActivity, "选中:${menuItem.title}", Toast.LENGTH_SHORT).show() // 执行打乱重排逻辑 popup.menu.apply { clear() // 清空原有菜单项 currentMenuItems = originMenuItems.shuffled() // 打乱原始列表 // 按打乱后的顺序重新添加菜单项 currentMenuItems.forEach { (itemId, title) -> add(Menu.NONE, itemId, Menu.NONE, title) } } // 点击后保持菜单显示返回true,需要关闭菜单返回false即可 true } popup.show() }
Java 实现
1. 预先定义菜单项原始数据
// 先定义菜单项信息实体类 static class MenuItemInfo { int id; String title; public MenuItemInfo(int id, String title) { this.id = id; this.title = title; } } // 初始化原始菜单项列表 List<MenuItemInfo> originMenuItems = new ArrayList<>(); originMenuItems.add(new MenuItemInfo(R.id.yellow, "Yellow")); originMenuItems.add(new MenuItemInfo(R.id.red, "Red")); originMenuItems.add(new MenuItemInfo(R.id.blue, "Blue")); originMenuItems.add(new MenuItemInfo(R.id.green, "Green")); // 存储当前打乱后的顺序,可选 List<MenuItemInfo> currentMenuItems = new ArrayList<>(originMenuItems);
2. PopupMenu 初始化与点击逻辑
// 替换为你触发弹出菜单的控件 showPopupBtn.setOnClickListener(v -> { PopupMenu popup = new PopupMenu(MainActivity.this, showPopupBtn); popup.getMenuInflater().inflate(R.menu.你的菜单XML文件名, popup.getMenu()); popup.setOnMenuItemClickListener(item -> { // 这里写你自己的菜单项点击业务逻辑 Toast.makeText(MainActivity.this, "选中:" + item.getTitle(), Toast.LENGTH_SHORT).show(); // 执行打乱重排逻辑 Menu menu = popup.getMenu(); menu.clear(); // 打乱列表 Collections.shuffle(originMenuItems); currentMenuItems = new ArrayList<>(originMenuItems); // 重新添加菜单项 for (MenuItemInfo info : currentMenuItems) { menu.add(Menu.NONE, info.id, Menu.NONE, info.title); } // 点击后保持菜单显示返回true,需要关闭菜单返回false即可 return true; }); popup.show(); });
注意事项
- 如果你需要点击菜单项后关闭菜单,下次弹出时仍显示上次打乱后的顺序,只需首次加载菜单时不 inflate XML,直接用
currentMenuItems列表生成菜单项即可 add方法的四个参数分别为:组ID、菜单项ID、排序权重、标题,排序权重传Menu.NONE时会按添加顺序显示,完全符合需求- 菜单项ID和原始XML保持一致,不会影响你原有按ID判断点击的业务逻辑
内容的提问来源于stack exchange,提问作者techdan
相关产品推荐
相关产品推荐

