Wie erstelle ich einen einfachen Teiler in der neuen NavigationView?

Lesezeit: 9 Minuten

Wie erstelle ich einen einfachen Teiler in der neuen NavigationView
Longi

Google hat die eingeführt NavigationView in der Design Support Library Version 22.2.0, mit der Sie ganz einfach über eine Menüressource eine Schublade erstellen können.

Wie kann ich eine einfache Trennlinie zwischen zwei Elementen erstellen? Das Gruppieren der Elemente hat nicht funktioniert. Das Erstellen eines Abschnitts für Unterelemente erstellt zwar eine Trennlinie, erfordert jedoch einen Titel, den ich nicht möchte.

Jede Hilfe wäre willkommen.

  • Wie in den Kommentaren dazu angegeben, besteht das Problem mit der akzeptierten Antwort darin, dass das überprüfbare Verhalten nicht über mehrere (parallele) Gruppen hinweg funktioniert. Um dies zu vermeiden, erstellen Sie keine parallelen Gruppen, sondern verwenden Sie Untermenüs oder Untergruppen, um Ihre Trennlinien zu erhalten, wie in meiner Antwort hier beschrieben: stackoverflow.com/questions/30766919/…

    – Bis

    24. November 15 um 23:12 Uhr

1641735620 144 Wie verwende ich den Prozentsatz fur das Android Layout
NJ

Alles, was Sie tun müssen, ist, a zu definieren group mit einem Eindeutige ID, ich habe die Implementierung überprüft, wenn die Gruppe unterschiedliche IDs hat, wird ein Teiler erstellt.

Beispielmenü zum Erstellen des Trennzeichens:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <group android:id="@+id/grp1" android:checkableBehavior="single" >
        <item
            android:id="@+id/navigation_item_1"
            android:checked="true"
            android:icon="@drawable/ic_home"
            android:title="@string/navigation_item_1" />
    </group>

    <group android:id="@+id/grp2" android:checkableBehavior="single" >
        <item
            android:id="@+id/navigation_item_2"
            android:icon="@drawable/ic_home"
            android:title="@string/navigation_item_2" />
    </group>
</menu>

  • Frage mich, warum dies (soweit ich weiß) nicht dokumentiert ist. Ich denke, es wird viel gefragt werden. Danke!

    – Gaëtan

    3. Juni 15 um 17:32 Uhr


  • Das einzige Problem bei diesem Ansatz ist das setChecked scheint auf Gruppenebene zu funktionieren. Wenn Sie ein Element in Gruppe A auswählen, dann die Schublade erneut öffnen und Element in Gruppe B auswählen, bleiben beide Elemente hervorgehoben. Vielleicht wird Google dieses Verhalten in der nächsten Version beheben, aber das ist vorerst der Nachteil bei der Verwendung mehrerer Gruppen mit NavigationView.

    – Hungriges Gespenst

    4. Juni 15 um 9:28 Uhr


  • Toll. Über die doppelt überprüft, versuchen Sie es android:checkableBehavior="none" für Ihre zweite Gruppe (das sind Aktionen, keine Navigation, nehme ich an)

    – Espinchi

    23. Juli 15 um 12:07 Uhr

  • Komisch, wenn man die ID aus der entfernt group es wird kompiliert und ausgeführt, aber die Teiler sind ausgeblendet.

    – Vahid Amiri

    8. Februar 16 um 7:04 Uhr

  • Das funktioniert bei mir auch nicht. Ich wollte Linien zwischen den Menügruppen, nicht nach jedem Punkt.

    – Rich Morey

    10. März 17 um 21:50 Uhr

Wie erstelle ich einen einfachen Teiler in der neuen NavigationView
vbp

Erstellen Sie ein Drawable schublade_item_bg.xml so was,

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#F4F4F4" />
        </shape>
    </item>

    <item android:top="-2dp" android:right="-2dp" android:left="-2dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dp"
                android:color="#EAEAEA" />
        </shape>
        <!--
        android:dashGap="10px"
                android:dashWidth="10px"
                -->
    </item>

</layer-list>

und fügen Sie es zu NavigationView als hinzu app:itemBackground=”@drawable/drawer_item_bg”

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="#F4F4F4"
        android:layout_gravity="start"
        android:fitsSystemWindows="false"
        app:menu="@menu/activity_main_drawer"
        app:itemBackground="@drawable/drawer_item_bg"/>

und es geht los…Geben Sie hier die Bildbeschreibung ein

  • Dies funktioniert, aber es entfernt auch die linke Polsterung des Elementsymbols. zumindest in meinem Code, aus irgendeinem Grund nicht in Ihrem Screenshot

    – glücklich

    14. Dezember 16 um 8:40 Uhr


  • @vbp Ich brauche den oberen Rand für das erste Kind, den unteren Rand für das andere Kind. Wie konnte ich erreichen. Es ist etwas Ähnliches wie id.first child in CSS

    – Prabs

    13. Februar 17 um 7:06 Uhr


  • @Prabs erwägen die Verwendung eines Fragments, einer Recycleransicht oder benutzerdefinierter Ansichten anstelle von NavigationView für eine bessere Anpassung

    – vbp

    23. Februar 17 um 11:18 Uhr

  • Ich habe getan navMenuView.addItemDecoration(new DividerItemDecoration(NavigationViewActivity.this, DividerItemDecoration.VERTICAL)); für perfekte Warenumrandung

    – Prabs

    27. Februar 17 um 5:39 Uhr

Sie können Trennlinien ganz einfach hinzufügen, indem Sie Menüelementhintergrund per XML mit festlegen app:itemBackground

<android.support.design.widget.NavigationView
    android:id="@id/drawer_navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/all_navigation_menu"
    app:itemIconTint="@color/colorPrimary"
    app:itemBackground="@drawable/bg_drawer_item"
    android:background="@color/default_background"/>

Und verwenden LayerDrawable als Hintergrund. Es behält die Materialdesign-Ripple-Überlagerung für Klicks bei.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
    <item android:left="@dimen/activity_horizontal_margin">
        <shape android:shape="rectangle">
            <solid android:color="@color/divider"/>
        </shape>
    </item>
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

Das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

  • scheint die beste Antwort zu sein und keine Gruppe beteiligt

    – Michal Ziobro

    23. Oktober 18 um 11:50 Uhr


  • Was ist, wenn Sie eine benutzerdefinierte Hintergrundfarbe für das ausgewählte Element verwenden möchten?

    – ataravati

    17. Juli 19 um 0:24 Uhr

  • Ich habe einen Fehler bei : Element ist hier nicht erlaubt

    – Sébastien REMY

    4. März 20 um 9:03 Uhr

1644014588 665 Wie erstelle ich einen einfachen Teiler in der neuen NavigationView
SANAT

Einfach DeviderItemDecoration hinzufügen:

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);
NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0);
navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL));

Es sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Ich denke, ich habe eine noch bessere Lösung für das Problem der mehrfach überprüften Artikel. Wenn Sie my way verwenden, müssen Sie sich keine Gedanken darüber machen, Ihren Code zu ändern, wenn Sie Ihrem Menü neue Abschnitte hinzufügen. Mein Menü sieht genauso aus wie die von Jared geschriebene akzeptierte Lösung, mit dem Unterschied, dass ich andoid:checkableBehavior=”alle” zu den Gruppen:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/first_section" android:checkableBehavior="all">
        <item
            android:id="@+id/frontpage"
            android:icon="@drawable/ic_action_home_24dp_light_blue"
            android:title="@string/drawer_frontpage" />
        <item
            android:id="@+id/search"
            android:icon="@drawable/ic_search"
            android:title="@string/drawer_search" />
    </group>
    <group android:id="@+id/second_section" android:checkableBehavior="all">
        <item
            android:id="@+id/events"
            android:icon="@drawable/ic_maps_local_movies_24dp_light_blue"
            android:title="@string/drawer_events" />
    </group>
</menu>

Das checkableBehavior von ‘all’ ermöglicht es, einzelne Elemente beliebig zu aktivieren/deaktivieren, unabhängig davon, zu welcher Gruppe sie gehören. Sie müssen nur den zuletzt geprüften Menüpunkt speichern. Der Java-Code sieht so aus:

private MenuItem activeMenuItem;

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
    // Update selected/deselected MenuItems
    if (activeMenuItem != null)
        activeMenuItem.setChecked(false);
    activeMenuItem = menuItem;
    menuItem.setChecked(true);

    drawerLayout.closeDrawers();
    return true;
}

Ich bin mir nicht sicher, ob das behoben ist API 26 (Android 8) oder es war die ganze Zeit möglich. Ich bin immer noch ein Noob in der Android-Programmierung. Ich habe jedoch Elterngruppen wie unten hinzugefügt. Testen auf einem physischen Android 6-Telefon,

  1. Ich habe den Teiler
  2. Auswählen eines beliebigen Elements aus beiden nav_g1 oder nav_g2 wird andere Elemente abwählen.
  3. Keine zusätzliche Polsterung aufgrund von verschachtelten Gruppen.
  4. Ich habe keine hinzugefügt Java Code für Zuhörer

Menücode

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <group
            android:id="@+id/nav_g1"
            android:checkableBehavior="single">
            <item
                android:id="@+id/nav_1"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_1"/>
            <item
                android:id="@+id/nav_2"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_2"/>
        </group>
        <group
            android:id="@+id/nav_g2"
            android:checkableBehavior="single">
            <item
                android:id="@+id/nav_3"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_3"/>
            <item
                android:id="@+id/nav_4"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_4"/>
        </group>
    </group>
    <item android:title="Actions">
        <menu>
            <item
                android:id="@+id/nav_7"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_7"/>
            <item
                android:id="@+id/nav_8"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_8"/>
        </menu>
    </item>
</menu>

Anmerkungen

  1. Wie in dieser Antwort erwähnt, muss jede Gruppe eine eindeutige ID haben, um den Teiler anzuzeigen.
  2. Laut dieser Antwort stimmen Leerzeichen mit den Materialdesignspezifikationen von Google überein.
  3. Haben android:checkableBehavior="single" für die Elterngruppe ist erforderlich, damit das Problem mehrerer ausgewählter Menüpunkte in dieser Antwort (in den Kommentaren von Hungrigghost erwähnt) nicht auftritt

Und hier ist der Screenshot

Screenshot des Gerätebildschirms

1644014589 148 Wie erstelle ich einen einfachen Teiler in der neuen NavigationView
Zowar Sachdev

Wenn Sie verschiedene Gruppen wie Nileshs Antwort erstellen, wird eine Trennlinie dazwischen erstellt, es entsteht jedoch das Problem von zwei aktivierten Elementen in der Navigationsschublade.

Ein einfacher Weg, wie ich damit umgegangen bin, war:

    public boolean onNavigationItemSelected(final MenuItem menuItem) {

    //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item
    if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) {


        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true);
        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true);
       }else{

        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true);
        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true);


    }
    //Update highlighted item in the navigation menu
    menuItem.setChecked(true);
}

  • Noch einfacher: android:checkableBehavior="none"

    – Espinchi

    23. Juli 15 um 12:05 Uhr

  • @espinchi – Das funktioniert nicht, wenn andere Gruppen Navigationsmenüpunkte enthalten. Diese Lösung könnte nur für Aktionen funktionieren. Keine gute UX-Praxis

    – Mushtaq Jameel

    26. Juli 15 um 19:54 Uhr

  • Exzellent! Es könnte klarer sein, wenn Sie Ihre undefinierten Konstanten NAV_ITEMS_MAIN und NAV_ITEMS_EXTRA mit R.id.nav_items_group_main oder R.id.nav_items_group_extra ändern und das erforderliche XML zu Ihrem Beispiel hinzufügen

    – Chris Prime

    4. August 15 um 20:05 Uhr

  • IST onNavigationItemSelected(final MenuItem menuItem) { Standardmethode?? Wo soll ich diesen Code eingeben?

    – John

    22. September 15 um 7:27 Uhr

  • und was ist NAV_ITEMS_MAIN??

    – John

    22. September 15 um 7:31 Uhr

.

775040cookie-checkWie erstelle ich einen einfachen Teiler in der neuen NavigationView?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy