MenuItem setChecked()不起作用



我有一个用于排序的菜单项。当用户单击该按钮时,将创建一个带有排序选项的PopupMenu。

现在我已经为每个项目创建了单选按钮,但似乎没有办法将选定的单选按钮设置为选中状态。我不知道出了什么问题。

这是我的菜单.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group
        android:id="@+id/group"
        android:checkableBehavior="single">
        <item
            android:id="@+id/fileName"
            android:title="Name" />
        <item
            android:id="@+id/fileDate"
            android:title="Date" />
    </group>
</menu>

这是我在onOptionsItemSelected()中的内容

if (id == R.id.sort) {
            final PopupMenu popupMenu = new PopupMenu(getActivity(), view);
            popupMenu.getMenuInflater().inflate(R.menu.sort_menu, popupMenu.getMenu());
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    int id = item.getItemId();
                    if (id == R.id.fileName) {
                        sortOrder = 0;
                    } else if (id == R.id.fileDate) {
                        sortOrder = 1;
                    } else if (id == R.id.fileSizeInc) {
                        sortOrder = 2;
                    } else if (id == R.id.fileSizeDec) {
                        sortOrder = 3;
                    }
                    item.setChecked(!item.isChecked());
                    return true;
                }
            });
            popupMenu.show();
        }

有人能帮我解决吗?

更新

我从@gfpacheco的回答中意识到了这个错误。我需要在显示弹出菜单之后而不是之前进行。但问题是,我如何获得特定的点击菜单项,以便在回调之外以编程方式检查它?

首先,您应该有一个字段来保存当前排序顺序,可能有一个默认值。

其次,在调用popupMenu.show()之前,您应该设置相应的单选按钮检查状态:

MenuItem menuItem;
switch (sortOrder) {
  case 0:
    menuItem = popupMenu.getMenu().findItem(R.id.menu_item_0);
    break;
  case 1:
    menuItem = popupMenu.getMenu().findItem(R.id.menu_item_1);
    break;
  case 2:
    menuItem = popupMenu.getMenu().findItem(R.id.menu_item_2);
    break;
}
menuItem.setChecked();

第三,在菜单点击回调中更新当前排序顺序的值:

sortOrder = newSortOrder;

这样,当弹出窗口再次打开时,第二步将确保已检查当前排序顺序。

这是我为两个选项菜单项找到的解决方案,你想用菜单和组来包装它。工作100%

添加这两个项目android:orderInCategory="1"用于第一个项目,android:orderInCategory="2"用于第二个项目

<item
    android:id="@+id/currency"
    android:icon="@drawable/currency"
    android:showAsAction="always"
    android:title="rthrth">
    <menu>
        <group
            android:id="@+id/currencies"
            android:checkableBehavior="single" >
            <item
                android:id="@+id/us"
                android:orderInCategory="1"
                android:showAsAction="never"
                android:title="@string/us"/>
            <item
                android:id="@+id/tr"
                android:orderInCategory="2"
                android:showAsAction="never"
                android:title="@string/tr"/>
        </group>
    </menu>
</item>

最新更新