Не работает проверяемое поведение всплывающего меню

#java #android #checkbox #menu #popupmenu

#java #Android #флажок #меню #popupmenu

Вопрос:

У меня есть файл ресурсов меню, подобный этому :

 <menu xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <group android:checkableBehavior="single">

        <item android:id="@ id/sort_all"
            android:title="All"
            android:orderInCategory="1" />

        <item android:id="@ id/sort_co"
            android:title="CoAuthors"
            android:orderInCategory="2" />

        <item
            android:id="@ id/sort_title"
            android:title="Title"
            android:orderInCategory="3" />
        <item
            android:id="@ id/sort_journal"
            android:title="Journals"
            android:orderInCategory="4" />
        <item
            android:id="@ id/sort_year"
            android:title="Year"
            android:orderInCategory="5" />

    </group>
</menu>
  

и я использую его во всплывающем меню :

         final PopupMenu popup = new PopupMenu(MainActivity.this, btn1);
        //Inflating the Popup using xml file
        popup.getMenuInflater().inflate(R.menu.search_menu, popup.getMenu());

        //registering popup with OnMenuItemClickListener
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {

                    case R.id.sort_co:
                        popup.getMenu().findItem(item.getItemId()).setChecked(true);
                        return true;

                    case R.id.sort_title:


                        item.setChecked(true);


                        return true;

                    case R.id.sort_journal:

                        item.setChecked(true);

                        return true;

                    case R.id.sort_year:

                        item.setChecked(true);

                        return true;
                    case R.id.sort_all:

                        item.setChecked(true);

                        return true;


                    default:
                        return true;
                }
            }

        });
        popup.show();
    }
});
  

как вы можете видеть, я пытался использовать

item.setChecked(true) и

 popup.getMenu().findItem(item.getItemId()).setChecked(true);
  

но проблема в том, что когда я нажимаю на элементы непосредственно перед закрытием меню, элемент проверяется, но когда я снова открываю меню, он не проверяется!
Я также пробовал использовать

 MenuItem subMenuItem = item.getSubMenu().getItem(INDEX_OF_ITEM); 
subMenuItem.setChecked(!subMenuItem.isChecked());
  

но это дает мне исключение NullPointerException … .

Комментарии:

1. Исключение NullPointerException обычно означает, что вы пытаетесь сослаться на объект, который не инициализирован.

2. @Danieboy Чувак, я знаю, что такое исключение NullPointerException, я прошу ответа, для всего всплывающего меню…

Ответ №1:

Вы можете попробовать эту модификацию в своем коде. Вот так:

 final PopupMenu popup = new PopupMenu(MainActivity.this, btn1);
    //Inflating the Popup using xml file
    popup.getMenuInflater().inflate(R.menu.search_menu, popup.getMenu());

    int item_selected = 1;
    if(item_selected == 1){
        popup.getMenu().findItem(R.id.sort_co).setChecked(true);
    }else if(item_selected == 2) {
        popup.getMenu().findItem(R.id.sort_title).setChecked(true);
    }

    //registering popup with OnMenuItemClickListener
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {

                case R.id.sort_co:
                    item.setChecked(true);
                    item_selected = 1;
                    return true;

                case R.id.sort_title:
                    item.setChecked(true);
                    item_selected = 2;

                    return true;


                default:
                    return true;
            }
        }

    });
    popup.show();