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

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>

enter image description here

2 ответов


прежде всего, вы можете упростить оператор if checked else до

item.setChecked(!item.isChecked())

таким образом, он всегда будет переключать его с true → false и наоборот.

но проблема заключается в том, что у вас есть радиобутоны, то, что делает приведенное выше утверждение, делает group проверил, но то, что вы хотите иметь item проверено.

чтобы получить поведение, которое вы ищете, вы можете использовать item.getSubmMenu() и затем используйте метод setChecked на особое subMenuItem вы хотите.

например:

//This will refer to the default, ascending or descending item.
MenuItem subMenuItem = item.getSubMenu().getItem(INDEX_OF_ITEM); 
//Check or uncheck it.
subMenuItem.setChecked(!subMenuItem.isChecked());

* * меняйте местами эти строки в каждом случае **

if (item.isChecked()) item.setChecked(false);
                    else item.setChecked(true);

до

if (item.isChecked()) item.setChecked(true);
                    else item.setChecked(false);