webentwicklung-frage-antwort-db.com.de

Wie füge ich ein zusammenklappbares Menüelement in der Navigationsleiste in Android hinzu?

Ich habe eine DrawerLayout, die eine NavigationView umschließt, und diese Layoutaktivität dient als gemeinsame Navigationsleiste für alle Aktivitäten in meiner App. Ich stelle die Menüressource für app:menu in der Navigationsansicht zur Verfügung. Ich habe einige Menüelemente, aber ich möchte, dass ein Menüelement faltbar/erweiterbar ist. Wenn ich darauf klicke, werden zwei Untermenüs eingeblendet und bei einem zweiten Klick wieder eingeblendet.

Ich habe Untermenüs hinzugefügt, indem ich einen weiteren <menu> in den <item> eingefügt habe, der aber nicht ausklappbar/erweiterbar ist.

Außerdem möchte ich ExpandableListView nicht für meine Zwecke verwenden. Stattdessen muss ich lediglich einige Änderungen in der Menü-Ressourcendatei vornehmen. Bitte zeig mir einfach die richtige Richtung. Ich habe nur mit Google nach Code, Blogs und Beispielen für reduzierbare Listenelemente mit ExpandableListView gesucht. Ich brauche es jedoch, um mit dem NavigationView-Design-Widget aus der Design-Support-Bibliothek zu arbeiten.

Hier ist mein Code für die Menüdatei:

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

Ich möchte, dass der Menüpunkt "Legal" erweiterbar ist und zwei Untermenüpunkte "Allgemeine Geschäftsbedingungen", "Datenschutzbestimmungen" enthält.

9
Kanwarbir Singh

Sie können erweiterbare Listenansichten in Navigationsschubladen verwenden. Ich verstehe nicht, warum Sie sie nicht verwenden möchten. Mehr dazu finden Sie hier http://developer.Android.com/reference/Android/widget/ExpandableListView.html

Wenn Sie darauf bestehen, expandableListView nicht zu verwenden, besteht die Alternative darin, die Erweiterung selbst zu entwerfen, indem Sie OnSelect des Menüs für dieses bestimmte Element verwenden. Obwohl ich wirklich nicht weiß, warum Sie das wollen, implementieren Sie einfach das Rad neu.

6
Ali Elgazar

es gibt einen Trick, dies ohne ExpandableListView zu tun. Fügen Sie diese Menüelemente normalerweise in der Menü-Layout-Datei hinzu und verbergen Sie sie beim Klicken auf das Elementelement des Menüelements, unter dem Sie sie wie folgt anzeigen möchten:

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

wo sich die Menü-Layout-Datei befindet:

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

In der Menü-Layoutdatei:

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

In MyActivity.Java - gewünschtes Menü laden:

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);
}

Und 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;
}

Ich habe 1 Element - Setup - und wenn der Benutzer es auswählt - setze ich Gruppe mit ID - SetupGroup - sichtbar und kehre zurück, ohne die Schublade zu schließen. Else - Ich setze alle Gruppen unsichtbar.

0
Stoyan Mihaylov