Элементы меню "Навигация ящика", выбранные в разных группах

У меня есть рабочий ящик навигации и некоторые проблемы с menuItem.setChecked(true); при использовании групп и заголовков в меню. Он не выделяет пункты меню, как ожидалось.

Вот мой XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ActivityMap">

    <group android:checkableBehavior="single">


        <item
            android:id="@+id/nav_welcome"
            android:icon="@drawable/abc_btn_check_to_on_mtrl_000"
            android:title="Welcome" />
        <item
            android:id="@+id/nav_map_showmap"
            android:icon="@mipmap/ic_map_black_24dp"
            android:title="Show Map" />
        <item
            android:icon="@mipmap/ic_list_black_24dp"
            android:title="Show List" />

        <item android:title="Settings">
            <menu>

                <item
                    android:id="@+id/nav_database_check"
                    android:icon="@mipmap/ic_cloud_done_black_24dp"
                    android:title="Update Database" />
                <item
                    android:id="@+id/nav_map_settings"
                    android:icon="@mipmap/ic_settings_black_24dp"
                    android:title="App Preferences" />

            </menu>
        </item>


        <item android:title="General">
            <menu>

                <item
                    android:id="@+id/nav_general_about"
                    android:icon="@mipmap/ic_info_black_24dp"
                    android:title="About" />
                <item
                    android:id="@+id/nav_general_help"
                    android:icon="@mipmap/ic_help_black_24dp"
                    android:title="Help" />
                <item
                    android:id="@+id/nav_general_report"
                    android:icon="@mipmap/ic_email_black_24dp"
                    android:title="Feedback / Report error" />
            </menu>
        </item>
    </group>
</menu>

Как вы можете видеть, у меня есть 3 пункта меню, затем группа настроек с двумя пунктами меню, а затем общая группа с 3 пунктами меню.

Теперь, когда первые 3 пункта меню, menuItem.setChecked(true); работает как ожидалось и выделяет этот пункт меню. Однако ни один из следующих пунктов меню в подмножестве (подстановки "Настройки" или "Общие" ) не выделяется правильно.

Я прочитал, что <group android:checkableBehaviour="single"> может инкапсулировать весь блок, но это, похоже, не работает.

Любые мысли? Приветствия.

EDIT. Добавлен скриншот структуры меню.

введите описание изображения здесь

Ответы

Ответ 1

UPDATE

Если вы обновили свою версию Android Studio до 1.4, вы можете создать новый проект (с шаблоном Navigation Drawer Activity). Затем вы можете обновить свой файл меню следующим образом (обратите внимание на две строки <group android:checkableBehavior="single"> внутри 2 подменю в "Общайтесь" и "BNK" ):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item android:id="@+id/nav_camara" android:icon="@android:drawable/ic_menu_camera"
            android:title="Import" />
        <item android:id="@+id/nav_gallery" android:icon="@android:drawable/ic_menu_gallery"
            android:title="Gallery" />
        <item android:id="@+id/nav_slideshow" android:icon="@android:drawable/ic_menu_slideshow"
            android:title="Slideshow" />
        <item android:id="@+id/nav_manage" android:icon="@android:drawable/ic_menu_manage"
            android:title="Tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/nav_share" android:icon="@android:drawable/ic_menu_share"
                android:title="Share" />
                <item android:id="@+id/nav_send" android:icon="@android:drawable/ic_menu_send"
                android:title="Send" />
            </group>
        </menu>
    </item>

    <item android:title="BNK">
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/nav_share_bnk" android:icon="@android:drawable/ic_menu_share"
                    android:title="Share BNK" />
                <item android:id="@+id/nav_send_bnk" android:icon="@android:drawable/ic_menu_send"
                    android:title="Send BNK" />
            </group>
        </menu>
    </item>
</menu>

И вот скриншот

Снимок экрана BNK

КОНЕЦ ОБНОВЛЕНИЯ


Как я уже прокомментировал, попробуйте поместить <group android:checkableBehavior="single"> под меню "Настройки" и "Общие" вместо того, чтобы размещать ниже внешнего меню. Это означает, что у вас будет 2 группы. Надеюсь, это поможет!

Ответ 2

Здесь вы можете использовать три разные группы: верх, центр и снизу. И первая верхняя группа будет иметь 3 пункта меню, как и у вас. Тогда центральная группа может быть такой же, как и в меню "Настройки" с двумя элементами. И нижняя группа будет иметь 2 элемента, как и в целом.

И в вашем java файле вы можете обрабатывать Item Selected Listener для обработки щелчка элемента меню навигации.

// This method will trigger on item Click of navigation menu
        @Override
        public boolean onNavigationItemSelected(MenuItem p_menuItem) {

            //Checking if the item is in checked state or not, if not make it in checked state

            if(p_menuItem.getGroupId()==R.id.menu_top){
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,true,true);
            }
            else if(p_menuItem.getGroupId()==R.id.menu_center){
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,true,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,false,true);
            }
            else{
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,true,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,false,true);
            }

            p_menuItem.setChecked(true);
            m_drawerLayout.closeDrawers();

Ответ 3

Попробуйте следующее:

 private int selectedItem = 0; 

  private void setSelectedItem(MenuItem menuItem, int position) {

          mNavigationView.getMenu().getItem(selectedItem).setChecked(false);
          mNavigationView.getMenu().getItem(position).setChecked(true);

          if (menuItem.getGroupId() == R.id.group_2) {
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_1, false, true);
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_2, true, true);
                } else {
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_1, true, true);
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_2, false, true);
                }
                //Update highlighted item in the navigation menu
                menuItem.setChecked(true);
                selectedItem = position;
    }

Ответ 4

Измените позицию в теге закрывающей группы </group> в вашем коде как:

Внимательно посмотрите на позицию и сделайте это.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ActivityMap">

    <group android:checkableBehavior="single">


        <item
            android:id="@+id/nav_welcome"
            android:icon="@drawable/abc_btn_check_to_on_mtrl_000"
            android:title="Welcome" />
        <item
            android:id="@+id/nav_map_showmap"
            android:icon="@mipmap/ic_map_black_24dp"
            android:title="Show Map" />
        <item
            android:icon="@mipmap/ic_list_black_24dp"
            android:title="Show List" />
    </group>

        <item android:title="Settings">
            <menu>

                <item
                    android:id="@+id/nav_database_check"
                    android:icon="@mipmap/ic_cloud_done_black_24dp"
                    android:title="Update Database" />
                <item
                    android:id="@+id/nav_map_settings"
                    android:icon="@mipmap/ic_settings_black_24dp"
                    android:title="App Preferences" />

            </menu>
        </item>


        <item android:title="General">
            <menu>

                <item
                    android:id="@+id/nav_general_about"
                    android:icon="@mipmap/ic_info_black_24dp"
                    android:title="About" />
                <item
                    android:id="@+id/nav_general_help"
                    android:icon="@mipmap/ic_help_black_24dp"
                    android:title="Help" />
                <item
                    android:id="@+id/nav_general_report"
                    android:icon="@mipmap/ic_email_black_24dp"
                    android:title="Feedback / Report error" />
            </menu>
        </item>
</menu>

Ответ 5

<group android:checkableBehavior="single">
    <item
        android:id="@+id/nav_vi_tri"
        android:icon="@drawable/ic_menu_camera"
        android:title="Vị trí" />
    <item
        android:id="@+id/nav_xem_lai"
        android:icon="@drawable/ic_menu_gallery"
        android:title="Xem lại hành trình" />
    <item
        android:id="@+id/nav_hinh_anh"
        android:icon="@drawable/ic_menu_slideshow"
        android:title="Hình ảnh" />

    <item android:title="Báo cáo">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_baocao1"
                    android:icon="@drawable/ic_menu_camera"
                    android:title="Hành trình xe chạy" />
                <item
                    android:id="@+id/nav_baocao2"
                    android:icon="@drawable/ic_menu_gallery"
                    android:title="Tốc độ của xe" />
                <item
                    android:id="@+id/nav_baocao3"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Quá tốc độ" />
                <item
                    android:id="@+id/nav_baocao4"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Thời gian lái" />
                <item
                    android:id="@+id/nav_baocao5"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Dừng đỗ" />
                <item
                    android:id="@+id/nav_baocao6"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Tổng hợp theo xe" />
                <item
                    android:id="@+id/nav_baocao7"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Quãng đường nhiên liệu" />
            </group>
        </menu>

    </item>

    <item android:title="Communicate">

        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_tien_ich"
                    android:icon="@drawable/ic_menu_share"
                    android:title="Tiện ích" />
                <item
                    android:id="@+id/nav_logout"
                    android:icon="@drawable/ic_menu_send"
                    android:title="Đăng xuất" />
            </group>
        </menu>

    </item>


</group>

он работает для меня: D