web-dev-qa-db-fra.com

Comment ajouter un élément de menu réductible dans le tiroir de navigation sous Android?

J'ai une DrawerLayout contenant une NavigationView et cette activité de mise en page sert de tiroir de navigation commun pour toutes les activités de mon application. Je fournis la ressource de menu pour app:menu dans la vue de navigation. J'ai quelques éléments de menu, mais je souhaite qu'un élément de menu soit pliable/extensible. Ainsi, lorsque je clique dessus, il s'agrandit pour afficher deux sous-menus et se réduit à nouveau lors d'un deuxième clic.

J'ai ajouté des sous-menus en ajoutant un autre <menu> à l'intérieur du <item>, mais je ne peux pas le rendre pliable/extensible.

De plus, je ne veux pas utiliser ExpandableListView pour mes besoins. Au lieu de cela, je dois juste faire quelques ajustements dans le fichier de ressources de menu. S'il vous plaît, dirigez-moi dans la bonne direction. J'ai cherché dans Google uniquement pour trouver du code, des blogs et des exemples d'éléments de liste réductibles à l'aide de ExpandableListView, mais j'ai besoin que cela fonctionne avec le widget de conception NavigationView de la bibliothèque d'aide à la conception.

Voici mon code pour le fichier de menu:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

<group Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_aboutus"
        Android:title="About Us" />

    <item
        Android:id="@+id/nav_faq"
        Android:title="FAQs" />
    <item
        Android:id="@+id/nav_share"
        Android:title="Share" />
    <item
        Android:id="@+id/nav_myaccount"
        Android:title="My Account" />
    <item
        Android:id="@+id/nav_legal"
        Android:title="Legal" >
        <menu>
                <item
                    Android:id="@+id/nav_tnc"
                    Android:title="Terms and Conditions" />
                <item
                    Android:id="@+id/nav_pp"
                    Android:title="Privacy Policy" />
            </group>
        </menu>
    </item>

</menu>

Je souhaite que l’élément de menu Légal soit extensible avec deux éléments de sous-menu "Conditions générales", "Politique de confidentialité".

9
Kanwarbir Singh

Vous pouvez utiliser des vues de liste extensibles dans les tiroirs de navigation. Je ne comprends pas pourquoi vous ne souhaitez pas les utiliser. Pour plus d'informations à ce sujet, cliquez ici http://developer.Android.com/reference/Android/widget/ExpandableListView.html

Si vous insistez pour ne pas utiliser expandableListView, vous pouvez également concevoir l'extension vous-même à l'aide de l'option OnSelect du menu pour cet élément spécifique. Bien que je ne sache pas vraiment pourquoi vous voulez cela, vous ne feriez que ré-installer la roue.

6
Ali Elgazar

il existe un truc pour faire cela sans utiliser ExpandableListView.Ajoutez ces éléments de menu normalement dans le fichier de présentation de menu et masquez-les/affichez-les en cliquant sur l'élément de menu sous lequel vous souhaitez les afficher comme ceci:

 public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        NavigationView nv= (NavigationView) findViewById(R.id.nav_view);
        Menu m=nv.getMenu();
        int id = item.getItemId();
        if (id == R.id.nav_posts) {
            boolean b=!m.findItem(R.id.nav_class).isVisible();
            //setting submenus visible state
            m.findItem(R.id.nav_class).setVisible(b);
            m.findItem(R.id.nav_dept).setVisible(b);
            m.findItem(R.id.nav_batch).setVisible(b);
            m.findItem(R.id.nav_campus).setVisible(b);
            return true;
        } else if (id == R.id.nav_walls) {
            boolean b=!m.findItem(R.id.nav_wall_events).isVisible();
            //setting submenus visible state
            m.findItem(R.id.nav_wall_events).setVisible(b);
            m.findItem(R.id.nav_wall_fun).setVisible(b);
            m.findItem(R.id.nav_wall_hadith).setVisible(b);
            m.findItem(R.id.nav_wall_news).setVisible(b);
            m.findItem(R.id.nav_wall_Poetry).setVisible(b);
            return true;
        } else if (id == R.id.nav_com) {

            m.findItem(R.id.nav_share).setVisible(false);
            m.findItem(R.id.nav_send).setVisible(false);

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

où le fichier de disposition de menu est:

<?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_posts"
            Android:icon="@drawable/ic_menu_camera"
            Android:title="Posts" />

        <item
            Android:id="@+id/nav_class"
            Android:title="Class"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_dept"
            Android:title="Department"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_batch"
            Android:title="Batch"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_campus"
            Android:title="Campus"
            Android:visible="false" />


        <item
            Android:id="@+id/nav_walls"
            Android:icon="@drawable/ic_menu_gallery"
            Android:title="Walls" />

        <item
            Android:id="@+id/nav_wall_news"
            Android:title="News"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_events"
            Android:title="Events"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_fun"
            Android:title="Fun"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_hadith"
            Android:title="Hadith"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_Poetry"
            Android:title="Poetry"
            Android:visible="false" />


    </group>

    <item
        Android:id="@+id/nav_com"
        Android:title="Communicate">
        <menu>
            <item
                Android:id="@+id/nav_share"
                Android:icon="@drawable/ic_menu_share"
                Android:title="Share" />
            <item
                Android:id="@+id/nav_send"
                Android:icon="@drawable/ic_menu_send"
                Android:title="Send" />
        </menu>
    </item>

</menu>
8
arslan

Dans le fichier de disposition de menu:

<item
        Android:title="Setup"
        Android:id="@+id/SetupGr"
        Android:icon="@drawable/setup"
        />
<group
    Android:checkableBehavior="none"
    Android:id="@+id/SetupGroup">
    <item
        Android:id="@+id/setupOutdoor"
        Android:icon="@drawable/outdoor"
        Android:title="Outdoor" />
    <item
        Android:id="@+id/setupClocks"
        Android:icon="@drawable/ic_launcher"
        Android:title="Clocks" />
    <item
        Android:id="@+id/selectMaps"
        Android:icon="@drawable/map"
        Android:title="Select map" />
</group>

Dans MyActivity.Java - chargez le menu souhaité:

public void LoadNavMenu(int iMenu){
    navigationView.getMenu().clear();
    navigationView.inflateMenu(iMenu);
    navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
    navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
}

Et OnNavigationItemSelected:

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
    navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
    switch (item.getItemId()){
        case R.id.HelpGr:
            navigationView.getMenu().setGroupVisible(R.id.HelpGroup,true);
            navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
            return true;
        case R.id.SetupGr:
            navigationView.getMenu().setGroupVisible(R.id.SetupGroup,true);
            navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
            return true;
    }    
    base.closeDrawer(GravityCompat.START);
    return true;
}

J'ai 1 élément - Configuration - et lorsque l'utilisateur le sélectionne - je configure le groupe avec id - Groupe d'installation - visible et le retourne sans fermer le tiroir. Sinon, je mets tous les groupes invisibles.

0
Stoyan Mihaylov