it-swarm.com.de

Wie kann ich eine Navigationsansicht mit einem Menülayout hinzufügen?

Ich habe mit dem Vereinfachen von Code für die Navigation in der Navigation experimentiert, indem ich die neue Klasse NavigationView in der Android-Design-Support-Bibliothek verwendet habe. Es funktioniert hervorragend, wenn Sie nur Symbole auf der linken Seite und Text auf der rechten Seite wie im Beispiel in der Dokumentation verwenden möchten. Was aber, wenn ich dem Layout eine einzelne benutzerdefinierte Ansicht hinzufügen möchte, die einen Android.support.v7.widget.SwitchCompat wie in der Google Play Movies-App hat (siehe Screenshot unten)?

Google Play Movies

Ich habe versucht, mit dem Attribut actionLayout eine benutzerdefinierte Layoutdatei wie im folgenden Beispielcode anzugeben. Dieses Attribut schien jedoch ignoriert zu werden, da es nicht funktioniert hat.

res/menu/navigation_drawer.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <group Android:id="@+id/group1"
            Android:checkableBehavior="single">
        <item
            Android:id="@+id/nav_screen1"
            Android:icon="@drawable/ic_list_black_24dp"
            Android:title="Screen 1" />
        <item
            Android:id="@+id/nav_screen2"
            Android:icon="@drawable/ic_search_black_24dp"
            Android:title="Screen2"/>
    </group>
    <group  Android:id="@+id/group2">
        <item
            Android:id="@+id/nav_custom"
            Android:icon="@drawable/custom_icon_24dp"
            app:actionLayout="@layout/nav_drawer_switch"
            Android:title="Custom item with switch"/>
        <item
            Android:id="@+id/nav_settings"
            Android:icon="@drawable/ic_settings_black_24dp"
            Android:title="Settings"/>
    </group>
</menu>

res/layout/nav_drawer_switch.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal" Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <Android.support.v7.widget.SwitchCompat
        Android:layout_width="fill_parent"
        Android:layout_height="match_parent"
        Android:text="Custom item with switch"/>
</LinearLayout>

Wie kann ich das zum Laufen bringen? Im Idealfall möchte ich die benutzerdefinierte Ansicht hinzufügen, während ich trotzdem mein Menü-Layout verwendet. Wenn dies jedoch nicht ohne einen groben Hack (wie das Tippen auf ein vorhandenes Layout, das von der Support-Bibliothek erstellt wurde) möglich ist, würde ich das gerne wissen Lösung mit der geringsten Menge an Code, und es lohnt sich dennoch, auf NavigationView zu wechseln.

46
Tim Rae

Das actionLayout-Attribut wird jetzt in der Android Support Library 23.1 unterstützt:

NavigationView bietet eine praktische Möglichkeit zum Erstellen einer Navigationsleiste, einschließlich der Möglichkeit, Menüelemente mithilfe einer Menü-XML-Datei zu erstellen. Wir haben die Funktionalität um die Möglichkeit erweitert, benutzerdefinierte Ansichten für Elemente über app: actionLayout oder mit MenuItemCompat.setActionView () festzulegen.

Der Code in der Frage sollte also jetzt funktionieren.

32
Tim Rae

NavigationView ist eine Unterklasse von FrameLayout, die mehrere Kinder haben kann:

Sie können jedoch einem FrameLayout mehrere untergeordnete Elemente hinzufügen und steuern ihre Position innerhalb des FrameLayout, indem jedem .__ die Schwerkraft zugewiesen wird. Kind mit dem Attribut Android: layout_gravity.

Das heißt, Sie können Ihrer NavigationView eine benutzerdefinierte Ansicht hinzufügen:

<Android.support.design.widget.NavigationView
    Android:layout_height="match_parent"
    Android:layout_width="wrap_content"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:menu="@menu/side_menu">

    <LinearLayout 
        Android:orientation="horizontal" 
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:layout_gravity="bottom">

        <Android.support.v7.widget.SwitchCompat
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:text="night_mode"/>
    </LinearLayout>
</Android.support.design.widget.NavigationView>
14
Vera Rivotti

erstellen Sie ein Layout mit switchcompat und erwähnen Sie es im Menüpunkt als

<item Android:id="@+id/notification"
        Android:title="Notification"
        app:actionLayout="@layout/notify" />`

dann benachrichtigen sie das layout

<Android.support.v7.widget.SwitchCompat
    Android:id="@+id/switch_compat"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="10dp"
    Android:checked="false"
    Android:onClick="notify"/>

onclick ist der keyPoint, implementiere einen Handler in deiner Aktivität, dann funktioniert es.

5
Ramesh Bhupathi

Vielleicht möchten Sie einen Blick auf diese Bibliothek werfen: https://github.com/mikepenz/MaterialDrawer . Es macht die Verwendung der Navigationsleiste einfach und unterstützt benutzerdefinierte Ansichten.

0
Loša

Ich hatte das gleiche Problem und stellte fest, dass sich NavigationView je nach folgenden Aspekten unterschiedlich verhält:

  • Ob Sie die Android:title- und Android:icon-Attribute auf item setzen oder nicht
  • Welche Art von Ansicht enthält Ihr Aktionslayout (z. B. TextView oder andere)

Die Attribute wurden nicht festgelegt, um das Element vollständig anzupassen:

<?xml version="1.0" encoding="utf-8"?>
<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:showIn="navigation_view">

    <item
        Android:id="@+id/nav_custom"
        Android:title="@null"
        app:actionLayout="@layout/nav_drawer_switch" />
</menu>

(Beachten Sie, dass Sie auch nicht Android:title einstellen können, aber dies führt in Android Studio zu einer Warnung.)

Das Ergebnis:

 navigation view with switch as custom action layout

(Dies ist mit Version 27.1.1 von com.Android.support:design, nicht sicher über andere Versionen.)

0
robinst