web-dev-qa-db-fra.com

Eléments de menu du tiroir de navigation sélectionnés dans différents groupes

J'ai un tiroir de navigation en état de fonctionnement et quelques problèmes avec menuItem.setChecked(true); lors de l'utilisation de groupes et d'en-têtes dans le menu. Il ne met pas en évidence les éléments de menu comme prévu.

Voici mon 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>

Comme vous pouvez le voir, j'ai 3 éléments de menu, puis un groupe de paramètres avec 2 éléments de menu, puis un groupe général avec 3 éléments de menu.

Maintenant, avec les 3 premiers éléments de menu, la menuItem.setChecked(true); fonctionne comme prévu et met en surbrillance cet élément de menu. Toutefois, aucun des éléments de menu suivants du sous-ensemble (sous-ensembles "Paramètres" ou "Général") n'est surligné correctement.

J'ai lu que le <group Android:checkableBehaviour="single"> peut encapsuler tout le bloc, mais cela ne semble pas fonctionner.

Des pensées? À votre santé.

EDIT- Ajout d'une capture d'écran de la structure du menu

 enter image description here

13
Jammo

METTRE À JOUR

Si vous avez mis à niveau votre Android Studio vers 1.4 , vous pouvez créer un nouveau projet (avec le modèle Navigation Drawer Activity). Ensuite, vous pouvez mettre à jour votre fichier de menu comme suit (faites attention aux deux lignes <group Android:checkableBehavior="single"> dans 2 sous-menus à "Communiquer" et "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>

Et voici la capture d'écran

 BNK's screenshot

FIN DE MISE À JOUR


Comme je l'ai dit, essayez de placer <group Android:checkableBehavior="single"> sous les menus de Paramètres et Général au lieu de mettre en dessous du menu extérieur. Cela signifie que vous aurez 2 groupes. J'espère que cela t'aides!

21
BNK

<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>

ça marche pour moi: D 

4
Fire Stork

Ici, vous pouvez utiliser trois groupes différents: haut, centre et bas. Et le premier groupe du haut aura 3 éléments de menu comme vous avez. Ensuite, le groupe central peut être identique à votre menu "Paramètres" avec 2 éléments. Et le groupe du bas aura 2 éléments comme c'est le cas en général.

Et dans votre fichier Java, vous pouvez gérer l'élément sélectionné comme écouteur pour gérer l'élément et cliquer sur le menu de navigation.

// 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();
1
Android Team

Essaye ça:

 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;
    }
0
KishuDroid

Changez la position sur la balise de groupe de fermeture </group> dans votre code comme suit

Regardez attentivement la position et faites-le.

<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>
0
Vipin Kumar