MenuItem setChecked () не работает

У меня есть пункт меню для сортировки. Когда пользователь нажимает на нее, создается PopupMenu с параметрами сортировки.

Теперь я создал RadioButtons для каждого из элементов, но, похоже, нет способа установить выбранный переключатель в проверенное состояние. Я не знаю, что происходит.

Вот мое меню.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. Мне нужно сделать это после того, как я покажу всплывающее меню, а не до него. Но проблема в том, как я могу получить конкретный щелкнутый MenuItem, чтобы я мог проверить его программно вне обратного вызова?


person Aritra Roy    schedule 30.06.2015    source источник
comment
@DanielNugent упомянул об этом в самой первой строке.   -  person Aritra Roy    schedule 30.06.2015
comment
проверьте этот сообщение. ваш ответ там .. также всегда не забывайте подтверждать сообщение   -  person Elltz    schedule 30.06.2015
comment
Я видел это. Это не тот случай здесь.   -  person Aritra Roy    schedule 30.06.2015
comment
хорошо, так что вы хотите получить конкретный пункт меню, который был нажат, и проверить его вне вашего интерфейса menuItem? если это так, вы знаете, какой элемент принимает вас или делает для вас, поэтому, если первый элемент открывает вид в этом представлении, вы найдете свой элемент меню с помощью чего-то вроде popmenu.getMenu().getItem(int) это то, что вы хотите?   -  person Elltz    schedule 30.06.2015


Ответы (2)


Во-первых, у вас должно быть поле для хранения текущего порядка сортировки, возможно, со значением по умолчанию.

Во-вторых, перед вызовом popupMenu.show() вы должны установить соответствующий переключатель в состояние Checked:

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;

Таким образом, когда всплывающее окно будет открыто снова, второй шаг убедится, что текущий порядок сортировки уже проверен.

person gfpacheco    schedule 30.06.2015
comment
Как получить конкретный щелкнутый элемент вне обратного вызова элемента? - person Aritra Roy; 30.06.2015
comment
Похоже, у вас есть 2 проблемы: получение отмеченного элемента вне обратного вызова и сохранение этого элемента отмеченным между всплывающими окнами. Пожалуйста, обновите свой вопрос, пока я пишу ответ - person gfpacheco; 30.06.2015
comment
Есть прогресс, @AritraRoy? - person gfpacheco; 30.06.2015
comment
Работает отлично. Для исправления это будет popupMenu.getMenu().findItem(R.id.id); и мне не нужен был метод updateSortOrder(0). - person Aritra Roy; 01.07.2015

вот решение, которое я нашел для двух пунктов меню опций, которые вы хотите обернуть меню и группой. Работает на 100%

добавьте эти два элемента android:orderInCategory="1" для 1-го элемента и android:orderInCategory="2" для 2-го элемента

person S Sathiya    schedule 30.06.2015
comment
Вы уверены, что ничего не пропустили? - person Aritra Roy; 30.06.2015