如何防止popup菜单closurescheckbox单击

我在网上search了很多,但没有关于阻止popup菜单closures。

每当我点击checkbox项目或任何其他popup菜单项,popup式菜单消除自己。 如何防止在用户选中/取消选中popup式菜单中的checkbox时将其解除。

我在操作栏菜单项的单击事件上显示popup式菜单。

//main_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.worldofjobs.woj.MainActivity" > <item android:id="@+id/action_popUpMenu" android:icon="@drawable/ic_action_overflow" android:title="@string/main_action_popUpMenu" app:showAsAction="always"/> </menu> //popup_items.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/refresh_item" android:title="@string/main_refresh"/> <item android:id="@+id/checkbox_item" android:checkable="true" android:title="Start notification"/> <item android:id="@+id/changePasswrod_item" android:title="@string/main_changePassword"/> <item android:id="@+id/deleteAccount_item" android:title="@string/main_deleteAccount"/> <item android:id="@+id/logout_item" android:title="@string/main_logout"/> </menu> /** * Shows popup menu on click of action bar-menu inflates from * menu.pop_items-xml */ private void showPopup() { try { View v = findViewById(R.id.action_popUpMenu); PopupMenu popup = new PopupMenu(this, v); popup.setOnMenuItemClickListener(MainActivity.this); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.pop_items, popup.getMenu()); popup.show(); } catch (Exception e) { Log.e("MainActivity-showPopup:", e.toString()); } } /** * Handles click events of popup menu items */ @Override public boolean onMenuItemClick(MenuItem item) { super.onMenuItemSelected(1, item); switch (item.getItemId()) { case R.id.refresh_item: refresh(); return true; case R.id.checkbox_item: return true; case R.id.changePasswrod_item: changePasswordPopup(); return true; case R.id.deleteAccount_item: deleteAccount(); return true; case R.id.logout_item: session.logout(); finish(); return true; } return true; } 

Solutions Collecting From Web of "如何防止popup菜单closurescheckbox单击"

使用popupMenu.show()立即重新显示popup式菜单在更改选中状态时不能正确使用可选菜单项。

这里有一个方法可以防止首先closurespopup式菜单。 确保onMenuItemClick返回false。

 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { item.setChecked(!item.isChecked()); // Do other stuff // Keep the popup menu open item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); item.setActionView(new View(context)); item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return false; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { return false; } }); return false; } }); 

这里的诀窍是在解散之后立即显示菜单。
下面是一个示例代码片段:

 popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if(item.getItemId()==R.id.search_by_date_checkbox){ item.setChecked(!item.isChecked()); } //This is the trick here!!!! popupMenu.show(); return true; } }); 

你可以用你的代码试试这个技巧! 这就是我做的。 🙂

在你的情况下,R.id.checkbox_item

 return false; 

这将告诉系统该事件尚未处理,并且不会使菜单变暗。 看到这里

尝试全局声明PopupMenu并调用popup.show();onMenuItemClick函数中返回true之前。

通过添加popup.show(); 点击button并点击结束。

 final ImageButton layerButton = (ImageButton) findViewById(R.id.layers); final PopupMenu popup = new PopupMenu(MapsActivity.this, layerButton); popup.getMenuInflater().inflate(R.menu.toolbar_menu, popup.getMenu()); layerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Here popup.show(); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { handleClicksOnCheckBoxes(item); return true; } }); //And here popup.show(); } }); 

但是,这不是一个最佳的解决scheme,因为如果列表中有太多的项目可以滚动列表,列表将滚动到顶部点击一个项目时。

上面的Oliver的回答( https://stackoverflow.com/a/31727213/2423194 )给了我一个崩溃,它的消息告诉我改用MenuItemCompat 。 经过一些调整这个代码,它的工作原理:

 // Keep the popup menu open item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); item.setActionView(new View(getContext())); MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return false; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { return false; } }); 

谢谢奥利弗!