如何不使用XML以编程方式为PopupMenu添加Switch菜单项
实现方案
无需XML代码即可实现,核心逻辑是动态创建Switch控件,通过MenuItem.setActionView()注入到菜单项中即可。
完整修改后代码
options.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View _view) { // 注意:这里建议用当前Activity作为上下文,不要用ApplicationContext,避免主题异常 PopupMenu myPopupMenu = new PopupMenu(YourActivity.this, options); myPopupMenu.getMenu().add("Option 1"); myPopupMenu.getMenu().add("Option 2"); myPopupMenu.getMenu().add("Option 3"); // 此处添加Switch菜单项 MenuItem switchItem = myPopupMenu.getMenu().add("The Title of The Switch"); // 动态创建Switch实例 Switch switchView = new Switch(YourActivity.this); // 可自定义Switch的初始选中状态、样式等 switchView.setChecked(false); // 将Switch设置为菜单项的自定义视图 switchItem.setActionView(switchView); myPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch(item.getTitle().toString()) { case "Option 1": { onFirstOptionClicked(); break; } case "Option 2": { onSecondOptionClicked(); break; } case "Option 3": { onThirdOptionClicked(); break; } case "The Title of The Switch": { // 获取Switch实例,读取选中状态 Switch sw = (Switch) item.getActionView(); // 切换选中状态 boolean isChecked = !sw.isChecked(); sw.setChecked(isChecked); // 此处isChecked就是当前Switch的选中状态,可直接用于业务逻辑 break; } } return true; } }); myPopupMenu.show(); } });
注意事项
- 代码中的
YourActivity需要替换为你当前页面的Activity实例 - 如果需要点击Switch控件本身即可切换状态,可以给Switch单独设置
OnCheckedChangeListener处理逻辑,不需要依赖菜单项点击事件
内容的提问来源于stack exchange,提问作者Omar Hemaia
相关产品推荐
相关产品推荐

