Android 如何防止单击复选框时弹出菜单关闭
我在网上搜索了很多东西,但并没有阻止弹出菜单关闭的措施 每当我点击复选框项或任何其他弹出菜单项时,弹出菜单会自动关闭。当用户在弹出菜单中勾选/取消勾选复选框时,如何防止它被解除 我在actionbar菜单项的点击事件上显示弹出菜单Android 如何防止单击复选框时弹出菜单关闭,android,checkbox,popupmenu,Android,Checkbox,Popupmenu,我在网上搜索了很多东西,但并没有阻止弹出菜单关闭的措施 每当我点击复选框项或任何其他弹出菜单项时,弹出菜单会自动关闭。当用户在弹出菜单中勾选/取消勾选复选框时,如何防止它被解除 我在actionbar菜单项的点击事件上显示弹出菜单 //main_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto
//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;
}
//main_menu.xml
//popup_items.xml
/**
*单击操作栏菜单时显示弹出菜单从
*menu.pop_items-xml
*/
私有void showPopup(){
试一试{
视图v=findViewById(R.id.action\u弹出菜单);
PopupMenu popup=新的PopupMenu(此,v);
setOnMenuItemClickListener(MainActivity.this);
MenuInflater充气器=弹出窗口。getMenuInflater();
充气器。充气(R.menu.pop_项,popup.getMenu());
popup.show();
}捕获(例外e){
Log.e(“MainActivity showPopup:,e.toString());
}
}
/**
*处理弹出菜单项的单击事件
*/
@凌驾
公共布尔onMenuItemClick(菜单项){
super.onMenuItemSelected(1,项);
开关(item.getItemId()){
案例R.id.refresh\u项目:
刷新();
返回true;
案例R.id.checkbox\u项目:
返回true;
案例R.id.changePasswrod\u项目:
changePasswordPopup();
返回true;
案例R.id.deleteAccount\u项目:
deleteCount();
返回true;
案例R.id.logout\u项目:
session.logout();
完成();
返回true;
}
返回true;
}
在您的案例中,R.id.checkbox\u项
return false;
这将告诉系统事件尚未处理,并且不会关闭菜单。请参见尝试全局声明PopupMenu并调用
popup.show()在菜单项中返回true之前,单击函数。这里的技巧是在菜单关闭后立即显示菜单。
下面是一个示例代码段:
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;
}
});
你可以用你的代码试试这个把戏!我就是这样做的。:) 使用popupMenu.show()
立即重新显示弹出菜单在更改可检查菜单项的选中状态时无法正常工作
这里有一种方法,首先防止关闭弹出菜单。确保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;
}
});
通过添加popup.show()使其正常工作;单击按钮和单击结束时
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();
}
});
但是,这不是一个最佳解决方案,因为如果列表中有太多的项目,可以滚动列表,那么当单击某个项目时,列表将滚动到顶部。Oliver上面的回答()使我崩溃,它的消息告诉我改为使用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;
}
});
谢谢你,奥利弗 哪里是复选框代码,请发布完整的代码。检查我的更新代码(通知项目-复选框项目)。复选框\项是可选中的弹出菜单项。在它停止关闭弹出菜单之前,我还没有对它的“单击/检查”事件执行任何操作。@sushant-哪个视图在vmain_menu.xml(操作栏上的菜单项)中保持@sushant-在这种情况下,你必须创建自定义视图,然后你可以处理你想要的所有事情。你在这里监听它的检查状态更改吗?在它停止关闭弹出菜单之前,我还没有对它的单击/检查事件做任何操作。它给我一个错误,说我需要使用MenuItemCompat。我在下面的答案()中有经过调整的代码。MenuItemCompat.OnActionExpandListener现在不推荐使用。是的,它不推荐使用。使用item.setOnActionExpandListener