【问题标题】:How to prevent popup menu from closing on checkbox click如何防止弹出菜单在复选框单击时关闭
【发布时间】:2015-06-25 21:20:07
【问题描述】:

我在网上搜索了很多,但没有阻止弹出菜单关闭。

每当我单击复选框项目或任何其他弹出菜单项时,弹出菜单都会自行消失。当用户在弹出菜单中选中/取消选中复选框时,如何防止它被关闭。

我在操作栏菜单项的点击事件上显示弹出菜单。

//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;
}

【问题讨论】:

  • 复选框代码在哪里,请发布完整代码。
  • 检查我更新的代码(notification_item - checkbox_item)。 checkbox_item 是可检查的弹出菜单项。在它停止关闭弹出菜单之前,我还没有对它的点击/检查事件做任何事情。
  • @sushant- v 中的哪个视图
  • main_menu.xml(操作栏上的菜单项)
  • @sushant- 在这种情况下,您必须创建自定义视图,然后您才能处理您想要的每一件事

标签: android checkbox popupmenu


【解决方案1】:

使用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;
    }
});

【讨论】:

【解决方案2】:

这里的技巧是在菜单关闭后立即显示它。
下面是示例代码sn-p:

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;
    }

});

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

【讨论】:

    【解决方案3】:

    上面 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;
        }
    });
    

    谢谢奥利弗!

    【讨论】:

    • MenuItemCompat.OnActionExpandListener 现已弃用。
    • 是的,它已弃用。使用item.setOnActionExpandListener
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      通过添加 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();
      
      
              }
          });
      

      但是,这不是一个最佳解决方案,因为如果列表中包含的项目太多以至于可以滚动列表,则单击某个项目时列表将滚动到顶部。

      【讨论】:

        【解决方案6】:

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

        return false;
        

        这将告诉系统该事件尚未被处理并且它不会关闭菜单。见HERE

        【讨论】:

        • 你在哪里监听它的检查状态变化?
        • 在它停止关闭弹出菜单之前,我还没有对它的点击/检查事件做任何事情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 2018-05-24
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多