Android PopupMenu可检查项目不检查

Tom*_*mas 6 checkbox android popupmenu

我有这个简单的PopupMenu,但当我点击一个项目时,该项目不会被检查.为什么?

在文档中:图标菜单中的菜单项(从选项菜单中)无法显示复选框或单选按钮.单选按钮显示,但只有状态不变...

Java的

public void showSortPopup() {
    View menuItemView = findViewById(R.id.action_sort);
    PopupMenu popup = new PopupMenu(this, menuItemView);
    popup.inflate(R.menu.sort);
    popup.getMenu().findItem(R.id.sort_def).setChecked(true);
    popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            switch (item.getItemId()) {
                case R.id.sort_def:
                    sortOrder = CardCursorContract.CardCursor.DEFAULT_SORT;
                    mCardsFragment.setSortOrder(sortOrder);
                    savePref();
                    if (item.isChecked()) item.setChecked(false);
                    else item.setChecked(true);
                    break;
                case R.id.sort_asc:
                    sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_ASC_SORT;
                    mCardsFragment.setSortOrder(sortOrder);
                    savePref();
                    if (item.isChecked()) item.setChecked(false);
                    else item.setChecked(true);
                    break;
                case R.id.sort_desc:
                    sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_DESC_SORT;
                    mCardsFragment.setSortOrder(sortOrder);
                    savePref();
                    if (item.isChecked()) item.setChecked(false);
                    else item.setChecked(true);
                    break;
                default:
                    break;
            }
            return false;
        }
    });
    popup.show();
}
Run Code Online (Sandbox Code Playgroud)

XML的文件

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/sort_def"
      android:title="@string/action_sort_def"
      android:orderInCategory="1"
      android:showAsAction="always" />

<item android:id="@+id/sort_asc"
      android:title="@string/action_sort_name"
      android:orderInCategory="2"
      android:showAsAction="always" />

<item
      android:id="@+id/sort_desc"
      android:title="@string/action_sort_name_desc"
      android:orderInCategory="3"
      android:showAsAction="always"/>
</group>
Run Code Online (Sandbox Code Playgroud)

屏幕

在此输入图像描述

zol*_*ish 4

首先,您可以将 if check else 语句简化为

\n\n
item.setChecked(!item.isChecked())\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样它总是会从 true \xe2\x86\x92 false 切换它,反之亦然。

\n\n

但问题在于你有单选按钮,上面的语句所做的是进行检查group,但你想要的是进行检查item

\n\n

要获得您正在寻找的行为,您可以使用item.getSubmMenu()setChecked 方法,然后对您想要的特定子菜单项使用 setChecked 方法。

\n\n

例如:

\n\n
//This will refer to the default, ascending or descending item.\nMenuItem subMenuItem = item.getSubMenu().getItem(INDEX_OF_ITEM); \n//Check or uncheck it.\nsubMenuItem.setChecked(!subMenuItem.isChecked());\n
Run Code Online (Sandbox Code Playgroud)\n