Wie füge ich eine Fußzeile zu NavigationView hinzu - Android unterstützt die Designbibliothek?


122

Wie kann ich Fußzeileneinstellungen und Profilelemente festlegen NavitationView? sieht aus wie der Posteingang per E-Mail-Navigationsschublade. Die NavitationViewElemente werden nach Menüressourcen aufgeblasen, aber ich weiß nicht, wie ich untere Elemente auf eine Menüressource festlegen oder wie ich eine benutzerdefinierte Ansicht NavigationViewoder einen unteren Versatz festlegen kann . Ich habe versucht, dies <LinearLayout...>als Fußzeilenansicht zu verwenden, aber auf kleinen Bildschirmen werden die Elemente in der Fußzeile angezeigt, und ich kann nicht durch das Menü scrollen. Ich habe versucht, eine Fußzeilenauffüllung festzulegen NavigationView, aber die Fußzeile übernimmt auch die Auffüllung.

Auf kleinen Bildschirmen wird nicht gescrollt:

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</android.support.design.widget.NavigationView>

NICHT SCROLLEN

Dies scrollt, aber die Fußzeile ist über den Menüelementen:

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:paddingBottom="96dp"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</android.support.design.widget.NavigationView>

Geben Sie hier die Bildbeschreibung ein

Schubladenmenü- res/menu/drawer.xmlDatei:

<?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/action_current_list"
            android:checked="true"
            android:icon="@drawable/ic_current_list"
            android:title="@string/current_list" />
        <item
            android:id="@+id/action_manage_lists"
            android:icon="@drawable/ic_my_lists"
            android:title="@string/my_lists" />
        <item
            android:id="@+id/action_search_products"
            android:icon="@drawable/ic_search_black_24dp"
            android:title="@string/search_products" />
        <item
            android:id="@+id/action_deals"
            android:icon="@drawable/ic_product_promo"
            android:title="@string/deals" />
    </group>
</menu>

In welchem Ort haben Sie die @ Menü / Schublade Datei setzen ..
Psypher

Es ist in/res/menu/drawer.xml
epool

Gibt es einen Grund, warum Sie "Feedback" und "Abmelden" nicht als Menüelemente verwenden können? Wenn der Grund dafür ist, dass Sie das Menüsymbol für "Abmelden" dynamisch ändern möchten, sollten Sie dies tun können menuItem.setIcon(Drawable).
Hungerghost

Es ist nur für Anforderungen, und ich persönlich möchte wissen, wie Google dies beispielsweise in der Posteingangs-App tut.
Epool

Diese Frage wird mit 23.1 Update noch wichtiger
Alex Sorokoletov

Antworten:


151

Wenn Sie eine feste Fußzeile (ohne Bildlauf) in Ihrem Navigationsmenü haben möchten, müssen Sie NavigationView um ein anderes Layout wickeln, wie Sie es gepostet haben. NavigationView funktioniert wie FrameLayout, sodass das innere Layout über den NavigationView-Menüelementen "gestapelt" wird. Hier ist eine Möglichkeit, dies mithilfe von LinearLayout für die Fußzeilenelemente anzuordnen:

Fußzeile behoben

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:clickable="true"
        android:orientation="vertical">
        <TextView
            android:id="@+id/footer_item_1"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center"
            android:text="Footer Item 1" />
        <TextView
            android:id="@+id/footer_item_2"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center"
            android:text="Footer Item 2" />
    </LinearLayout>

</android.support.design.widget.NavigationView>

In diesem Beispiel habe ich TextViews verwendet, aber Sie können für die Fußzeilenansichten alles verwenden, was Sie möchten. Um zu vermeiden, dass sich die Fußzeilenelemente mit dem unteren Rand des Menüs überschneiden, fügen Sie am Ende Ihrer Menüressourcendatei einige Dummy-Elemente hinzu (diese wirken wie "Abstandshalter"):

res / menu / drawer.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group>
        <item
            android:id="@+id/nav_item_1"
            android:icon="@drawable/ic_nav_item_1"
            android:title="Nav Item 1" />
        <item
            android:id="@+id/nav_item_2"
            android:icon="@drawable/ic_nav_item_2"
            android:title="Nav Item 2" />
        <item
            android:id="@+id/nav_item_3"
            android:icon="@drawable/ic_nav_item_3"
            android:title="Nav Item 3" />
        <item
            android:id="@+id/nav_item_4"
            android:icon="@drawable/ic_nav_item_4"
            android:title="Nav Item 4" />
        <item
            android:id="@+id/footer_spacer_1"
            android:checkable="false"
            android:enabled="false"
            android:orderInCategory="200"
            android:title="" />
        <item
            android:id="@+id/footer_spacer_2"
            android:checkable="false"
            android:enabled="false"
            android:orderInCategory="200"
            android:title="" />
    </group>
</menu>

Vergessen Sie nicht, in Ihrer Aktivität Klick-Listener für die tatsächlichen Fußzeilenansichten hinzuzufügen:

...
// Click listener for nav footer.
View navFooter1 = findViewById(R.id.footer_item_1);
navFooter1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
View navFooter2 = findViewById(R.id.footer_item_2);
navFooter2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
...

Scrolling-Fußzeile

Wenn Sie der Fußzeile jedoch erlauben, mit dem Rest der Navigationsansicht zu scrollen, wird dies einfacher (keine zusätzlichen Layouts oder Klick-Listener). Fügen Sie einfach die Fußzeilenelemente als eindeutige Elemente zu Ihrer Menüressourcendatei hinzu <group>(dies erzeugt eine Trennlinie ), und alles wird automatisch behandelt und zusammen gescrollt:

res / menu / drawer.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/nav_menu">
        <item
            android:id="@+id/nav_item_1"
            android:icon="@drawable/ic_nav_item_1"
            android:title="Nav Item 1" />
        <item
            android:id="@+id/nav_item_2"
            android:icon="@drawable/ic_nav_item_2"
            android:title="Nav Item 2" />
        <item
            android:id="@+id/nav_item_3"
            android:icon="@drawable/ic_nav_item_3"
            android:title="Nav Item 3" />
        <item
            android:id="@+id/nav_item_4"
            android:icon="@drawable/ic_nav_item_4"
            android:title="Nav Item 4" />
    </group>
    <group android:id="@+id/nav_footer">
        <item
            android:id="@+id/nav_footer_1"
            android:icon="@drawable/ic_footer_item_1"
            android:title="Footer Item 1" />
        <item
            android:id="@+id/nav_footer_2"
            android:icon="@drawable/ic_footer_item_2"
            android:title="Footer Item 2" />
    </group>
</menu>

1
Es ist nur für Anforderungen, und ich persönlich möchte wissen, wie Google dies beispielsweise in der Posteingangs-App tut.
Epool

Ich bin mir nicht sicher, wie Google es in der Google Mail-App macht, aber anscheinend sieht es genauso aus wie in der Antwort beschrieben. Verwenden Sie eine separate <group> Trennlinie, wenn Sie eine Trennlinie wünschen. Andernfalls sieht die Navigationsfußzeile der Google Mail-App wie normale Menüelemente aus (zumindest für mich).
Hungerghost

1
Ahh, ich verstehe jetzt. Ich dachte, Sie sprechen über die Google Mail-App. Ich habe die Posteingangs-App nicht installiert, aber wenn Sie nach einer statischen Fußzeile suchen, müssen Sie ein separates Layout verwenden. Das sollte aber nicht zu schwer sein. Mal sehen ...
hungrigghost

7
Sie können <dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen> in dimen.xmlanstelle von Dummy-Elementen im Menü verwenden! es ist perfekt !
Omid

1
Wie kann ich die Schriftart und Schriftgröße des Schubladenelements für die Fußzeilentextansicht festlegen?
JEGADEESAN S

37

Ich gebe Ihnen nur den Hinweis, wie Sie es lösen können, aber ich habe keine Chance, es in NavigationView zu testen, und bin mir ziemlich sicher, dass es funktionieren wird

hier das Beispiellayout xml;

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:clipToPadding="false"
  android:paddingBottom="96dp">

  <TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#6F00" />

  <TextView
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="-96dp"
    android:background="#600F" />

</FrameLayout>

Hier ist das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Der Trick besteht darin, dem Elternteil eine Auffüllung und dem Kind einen Minusrand zuzuweisen.


Schneller Versuch:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="start"
  android:clipToPadding="false"
  android:paddingBottom="96dp"
  app:headerLayout="@layout/sample_header"
  app:menu="@menu/sample_menu">


  <TextView
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="-96dp"
    android:background="#600F"
    android:gravity="center"
    android:text="I STAND BY MY SELF" />

</android.support.design.widget.NavigationView>

Geben Sie hier die Bildbeschreibung ein


3
Das mag funktionieren, aber negative Margen sind ziemlich hackig. Ich persönlich vermeide sie also, wenn möglich.
Hungerghost

Diese Fußzeile, wenn Sie Symbole in der Mitte "Botom" setzen, können Sie je nach Bildschirm ändern und werden geschnitten, siehe diesen Beitrag stackoverflow.com/questions/32460312/…
liefern

Können Sie einen Link zum vollständigen Beispiel bereitstellen?
liefern

können wir es auf scrollbar setzen?
Ahmad Shahwaiz

27

Nach den in den anderen Antworten zum Verschachteln von Navigationsansichten beschriebenen Ansätzen traten einige Probleme auf:

  • Bei vielen Elementen oder im Querformat überlappte sich die Fußzeile mit den Menüelementen
  • Wenn das reale Menü viele Elemente enthält, wurde die verschachtelte Navigationsansicht scrollbar, was nicht gut aussah
  • Mit zwei Navigationsansichten in der Verschachtelung konnten benutzerdefinierte Ansichten nicht als Fußzeile definiert werden.
  • Der Umgang mit verschachtelten Bildlaufansichten war ein Chaos (manchmal wurden zwei Bildlaufleisten angezeigt usw.)
  • Die feste Fußzeile sollte immer unten sein (mit wenigen sowie mit vielen Menüpunkten).

Meine Lösung für all diese Probleme war die folgende:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout ...>

    <include layout="@layout/main_content"/>

    <android.support.design.widget.NavigationView ...>

        <android.support.v4.widget.NestedScrollView
            ...
            android:fillViewport="true"
            android:scrollbars="vertical">

            <LinearLayout
                ...
                android:orientation="vertical">

                <android.support.design.widget.NavigationView
                    ...
                    app:elevation="0dp"
                    app:headerLayout="@layout/nav_header"
                    app:menu="@menu/nav_menu">
                </android.support.design.widget.NavigationView>

                <LinearLayout
                    android:id="@+id/spacer_to_bottom"
                    ...
                    android:layout_height="0dp"
                    android:layout_weight="1">
                </LinearLayout>

                <include layout="@layout/nav_footer"></include>
            </LinearLayout>
        </android.support.v4.widget.NestedScrollView>
    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

Hier fungiert die NestedScrollView als übergeordnetes Bildlaufelement für die Sub-NavigationView. Das bedeutet, dass in der Unter-Navigationsansicht niemals Bildlaufleisten selbst angezeigt werden, sondern der gesamte Inhalt flach angezeigt wird.

Das Layout 'spacer_to_bottom' füllt den gesamten verbleibenden Platz aus, sodass sich die Fußzeile mit wenigen Menüsymbolen immer noch unten befindet.

Schließlich wird die feste Fußzeile zum linearen Layout hinzugefügt, das mit dem realen Menü (Sub-NavigationView), dem Abstandshalter, beginnt und unten die Fußzeile hat.

Hier finden Sie das vollständige Arbeitsbeispiel als AndroidStudio-Project: https://github.com/MarcDahlem/AndroidSidemenuFooterExample

Besonders die Navigationsschublade finden Sie hier: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Screenshots:

Nur wenige Artikel Viele Artikel


Was genau funktioniert nicht? Bei Bedarf kann ich ein Beispielprojekt bereitstellen, das mit einer Bildlauf-Fußzeile hervorragend funktioniert. @ AndreaBaccega
Adreamus

Ich bin mit @AndreaBaccega einverstanden, funktioniert nicht, zeigt nur das Navigationsmenü und zeigt nicht die Fußzeile
RdlP

Okay, zweiter mit Problemen. Ich werde ein Beispielprojekt erstellen und es auf github hochladen. cu bald
Adreamus

Ich habe ein Beispielprojekt auf github hinzugefügt: github.com/MarcDahlem/AndroidSidemenuFooterExample
Adreamus

Große Gegenstimme für das Höhenattribut. Ich ging mit dem gleichen Ansatz vor, konnte aber den unteren Schatten nicht loswerden. Dann habe ich das gefunden. Danke dir!
Elvedin Selimoski

23

Die einfachste Antwort besteht darin, eine Schaltfläche in das Schubladenlayout einzufügen und die Schwerkraft im unteren Bereich der Schublade festzulegen navigationview.xml.

Hier ist der Code:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/navigation"
   android:layout_width="200dp"
   android:layout_height="match_parent"
   android:layout_gravity="start"
   app:headerLayout="@layout/navigation_header"
   app:menu="@menu/menu_navigation">

     <Button
            android:id="@+id/btn_sing_in"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="@string/sign_in"
            android:layout_gravity="bottom"/>

</android.support.design.widget.NavigationView>

Hier ist das Ergebnis


2
Bei einigen Menüpunkten funktioniert dies möglicherweise. Sobald Sie jedoch viele Menüelemente haben, überlappt sich die Schaltfläche mit den Menüelementen auf kleinen Geräten oder im Querformat.
Adreamus

1
Um dies zu überwinden, können Sie jedoch leere Menüpunkte einfügen.
Mohammed Fadhl

Es ist nahezu möglich, den unteren Bereich mit leeren Menüelementen für verschiedene Bildschirmgrößen zu versehen. Aber es gibt einen allgemeinen Weg, dies zu tun, wie ich in meiner Lösung beschrieben habe ;-) -> siehe meine Lösung stackoverflow.com/a/37714353/1075072
Adreamus

17

Sie benötigen ein Layout für die Containernavigationsansicht, das dann zwei weitere Navigationslayouts enthalten sollte. Sie richten diese oben und unten im übergeordneten Layout aus.

Ich würde empfehlen, eine Navigationsansicht als übergeordnetes Element und kein FrameLayout zu verwenden, da es sich im Wesentlichen um ein ScrimFrameLayout handelt und besser mit der Statusleiste interagiert.

Hier ist ein Beispiel dafür, wie Ihre Aktivität aussehen sollte:

<android.support.v4.widget.DrawerLayout 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"
android:id="@+id/layout_dashboard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<!-- Activity content goes here -->

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_drawer_container"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="top"
        app:menu="@menu/menu_navigation_drawer" />

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer_bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:menu="@menu/menu_navigation_drawer_bottom" />

</android.support.design.widget.NavigationView>

Sie können mehr darüber lesen und ein Beispiel hier sehen: http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top


1
Es ist wirklich eine schöne Lösung. Wrap-Inhalte funktionieren jedoch nicht sowohl in der oberen als auch in der unteren Navigationsansicht. Sie müssen eine konstante Höhe angeben, um zu verhindern, dass der untere NavigationView-Block den oberen NavigationView blockiert.
Olcay Ertaş

perfekte Lösung
Bolein95

@Nitish wie man Überlappungen vermeidet, wenn "@ + id / navigation_drawer" im Hochformat mehr Werte hat. es ging hinter die untere Navigationsansicht. In meinem Fall werden die oberen Navview-Menüelemente dynamisch ausgefüllt, die untere Navview hat statische Menüwerte.
MohanRaj S

14

Ich kenne die späte Antwort, aber die perfekte und genaue Antwort, nach der die meisten Entwickler suchen.

Fügen Sie zum Hinzufügen einer Fußzeile in der Navigationsansicht eine benutzerdefinierte Ansicht zum Navigationsmenü wie folgt hinzu:

footer_navigation_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="@string/version" />

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:gravity="right" />

</RelativeLayout>

Fügen Sie nun die obige Ansicht mit dem Gruppenattribut in Ihre Menü-XML ein. Damit kann sie als Fußzeile im Menü unterschieden werden.

profile_menu.xml

<group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_support"
        android:title="@string/nav_item_support" />

    <item
        android:id="@+id/nav_settings"
        android:title="@string/nav_item_settings" />

    <item
        android:id="@+id/nav_log_out"
        android:title="@string/nav_item_log_out" />
</group>
<group
    android:id="@+id/nav_footer">
    <item
        android:id="@+id/nav_log_version"
        app:actionLayout="@layout/footer_navigation_menu" />
</group>

Das ist es. Unten ist die Ausgabe:

Geben Sie hier die Bildbeschreibung ein


Bei einer komplexen Ansicht von unten funktioniert dies nicht, da die Ansicht von unten eine feste Höhe aufweist.
Akash Bisariya

Es könnte funktionieren, aber es gibt keine Möglichkeit, onClickListeners auf die Ansichten innerhalb des Fußzeilenlayouts festzulegen ... In meinem Fall habe ich Social-Media-Schaltflächen in der Fußzeile, die an externe URLs senden, konnte die Ansichten jedoch in keiner Weise mit ihren IDs abrufen Ich könnte an ... denken
Ramiro GM

12

Es ist eine Art Patzer, dass NavigationView keine Möglichkeit hat, Fußzeilen hinzuzufügen. Aber Sie können so etwas versuchen,

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_base"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view_container"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:fitsSystemWindows="false"
        android:layout_gravity="start"
        >

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbarAlwaysDrawVerticalTrack="true"
            android:scrollbars="vertical"
            android:isScrollContainer="true"
            app:headerLayout="@layout/nav_header_base"
            app:menu="@menu/activity_base_drawer"
            android:layout_gravity="top"
            android:layout_marginBottom="x"
            />

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view_footer"
            android:layout_width="wrap_content"
            android:layout_height="x"
            app:headerLayout="@layout/hear_layout"
            app:menu="@menu/menu_items"
            android:scrollbars="none"
            android:layout_gravity="bottom"
            />

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

Falls Ihre Fußzeile eine Liste ist,

    app:headerLayout="@null"
    app:menu="@menu/activity_base_drawer_footer"

Wenn es sich jedoch um eine benutzerdefinierte Ansicht handelt,

    app:headerLayout="@layout/my_cutom_footer_view"
    app:menu="@null"

Auch in diesem Fall müssen Sie einstellen x = height of your custom footer view

Ich hoffe es hilft.


Dank bro. Du hast meinen Tag gemacht .. :)
SiddharthG

3
3 Navigationsansichten? Warum? Für schlechteste Leistungen? Bitte schauen Sie sich einige dieser Videos an: youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
Louis CAD

@LouisCAD Wenn Sie eine Lösung haben, die tatsächlich ohne negative Marge funktioniert, teilen Sie sie uns bitte mit. Ich habe das hier erwähnte Problem und dies ist die einzige Lösung, die ich in Betracht ziehe. Möglicherweise ist dies nicht die perfekte Lösung und hat möglicherweise Auswirkungen auf die Leistung. Kommentieren Sie jedoch ohne andere Implementierung nicht nur Leistungsaspekte. Zuallererst sind App-Anforderungen wichtig. Wenn Google keine Lösung für Ihre App-Anforderungen bietet, haben Sie nicht viele Optionen.
Dascalescu Vladut

10

Geben Sie hier die Bildbeschreibung einIch habe dasselbe auf folgende Weise gemacht:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout  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"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"
        >

        <LinearLayout android:layout_gravity="bottom"
            android:background="#20191d1e"
            android:layout_width="match_parent"
            android:paddingBottom="2dp"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="2dp"
            android:orientation="horizontal"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/company_image_id"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_margin="@dimen/margin1dp"
                android:padding="@dimen/margin2dp"
                android:src="@mipmap/ic_launcher_round"
                />

            <TextView
                android:id="@+id/txtCompanyName"
                android:layout_width="match_parent"                              android:layout_marginLeft="@dimen/margin3dp"
                android:layout_height="wrap_content"
                android:textSize="13dp" android:layout_gravity="center"
                android:textStyle="bold"
                android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
        </LinearLayout>
    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

Hier ist die Hauptsache, dass ich die Layout-Schwerkraft nach unten lege, z

LinearLayout android:layout_gravity="bottom"

Mit dieser Lösung schwebt die Unteransicht über den Menüelementen (wenn es mehrere Menüelemente gibt) ... Aber ich möchte, dass es unten behoben wird.
Akash Bisariya

7

Nach Ihrem Ansatz können einige geringfügige Änderungen dazu beitragen, was Sie erreichen möchten.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="@color/background_material_light">
    <TextView
       android:id="@+id/footer_item"
       android:layout_width="match_parent"
       android:layout_height="?attr/listPreferredItemHeight"
       android:background="?attr/selectableItemBackground"
       android:gravity="center_vertical"
       android:paddingLeft="?attr/listPreferredItemPaddingLeft"
       android:text="Something"
       android:textAppearance="?attr/textAppearanceListItem" />
</LinearLayout>

Stellen Sie einige Stub-Elemente im Menü ein, damit sich die Menüelemente nicht überschneiden.

<group>
    ...
    <item
        android:title=""
        android:orderInCategory="200"/>
</group>

Außerdem möchten Sie Ihrem Fußzeilenelement einen Klick-Listener hinzufügen.


Vielen Dank für Ihre Antwort. Dies gab mir eine Problemumgehung, um meine Fußzeile hinzuzufügen, aber ich hoffe, dass Sie Ihre Antwort akzeptieren, wenn mir niemand eine bessere Antwort gibt, um es besser zu machen. +1
Epool

Halten Sie Ihre Optionen in der Tat offen. Ich freue mich auch auf bessere Antworten, da Fußzeilen wichtig sind.
Razzledazzle

6

Meine Lösung mit festen Fußzeilen- und Bildlaufmenüs (100% getestet)

 <android.support.design.widget.NavigationView
    android:id="@+id/container_navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity=""
    android:nestedScrollingEnabled="true"
    android:scrollIndicators="none">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_above="@+id/navigation2"
            android:layout_gravity="top"
            android:nestedScrollingEnabled="true"
            android:paddingBottom="@dimen/dimen_20_dp"
            app:headerLayout="@layout/nav_header"
            app:itemIconTint="@color/black_800"
            app:itemTextColor="@color/black_800"
            app:menu="@menu/navigation_drawer_items">

        </android.support.design.widget.NavigationView>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:background="@color/white_100"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/empty_spacer"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Share" />

                <TextView
                    android:id="@+id/mnuRate"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Rate" />

                <TextView
                    android:id="@+id/mnuHelp"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Help" />
            </LinearLayout>
        </android.support.design.widget.NavigationView>

    </RelativeLayout>

</android.support.design.widget.NavigationView>

6

So erreiche ich das Hinzufügen eines Layouts am unteren Rand der Navigation:

Aktualisierte Bibliotheken

    <com.google.android.material.navigation.NavigationView
    android:id="@+id/navigation_drawer_container"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/nav_view"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_gravity="top"
                    android:layout_weight="0.8"
                    app:headerLayout="@layout/nav_header_home"
                    app:menu="@menu/activity_home_drawer" />

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/navigation_drawer_bottom"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_weight="0.2">

                    <LinearLayout
                        android:id="@+id/linearLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_alignParentBottom="true"
                        android:layout_below="@+id/scrollView"
                        android:orientation="vertical">

                        <TextView
                            android:id="@+id/text_dashboard_followUsAt"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:paddingLeft="16dp"
                            android:paddingStart="16dp"
                            android:text="Follow us at" />

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="horizontal"
                            android:paddingLeft="16dp"
                            android:paddingStart="16dp">

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />
                        </LinearLayout>

                        <TextView
                            android:id="@+id/text_dashboard_version"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="end"
                            android:layout_marginTop="25dp"
                            android:paddingBottom="5dp"
                            android:paddingEnd="16dp"
                            android:paddingRight="16dp"
                            android:text="Version 1.0" />
                    </LinearLayout>
                </com.google.android.material.navigation.NavigationView>
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>
</com.google.android.material.navigation.NavigationView>

Dies ist die richtige Lösung zum Hinzufügen eines Fußzeilenlayouts am unteren Rand der Navigationsansicht. Obwohl kein lineares Layout benötigt wurde, das ich in dieser Antwort bearbeitet habe.
Akash Bisariya

Wie haben Sie den ausgewählten Listener für Navigationselemente in dieser Aktivität festgelegt? @zohaib khaliq
Akash Bisariya

5

NavigationViewDas erste ListViewuntergeordnete Element enthält sowohl Kopf- als auch Menüelemente.

Das einzige, was zum Hinzufügen einer Fußzeile erforderlich ist, ist der Aufruf von .addFooterView zur ListView

Weitere Informationen: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

Kopieren Einfügen Code:

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ListView listView = (ListView) navigationView.getChildAt(0);
    View toRet = LayoutInflater.from(view.getContext()).inflate(R.layout.drawer_footer, listView, false);

    // Manipulate the view (if you need to) before calling addFooterView.

    listView.addFooterView(toRet, null, false);
  }

10
auf der 'com.android.support:design:23.1.0' funktioniert nicht. es ist ein RecyclerView im NavigationMenuPresenter
gordonpro

Ich habe eine neue Antwort hinzugefügt, die Ihr Problem lösen könnte.
Lukas

2

Fügen Sie einfach ein anderes Layout in Ihre Navigationsansicht ein:

<android.support.design.widget.NavigationView 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#000000"
        app:itemTextColor="#FFFFFF"
        app:headerLayout="@layout/fragment_side_menu_header"
        app:menu="@menu/side_menu">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom">
        <TextView
            android:textColor="#FFFFFF"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test" />
        <TextView
            android:textColor="#FFFFFF"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test2" />
    </LinearLayout>
</android.support.design.widget.NavigationView>

Der Trick besteht darin, layout_gravity = "bottom" zu verwenden. Dadurch wird Ihr gesamtes Layout unten platziert und test, test2 wird ordnungsgemäß gestapelt.


2

benutze das..

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/nav_header"
    app:itemIconTint="@color/accent"
    app:itemTextColor="@color/primary_text"
    app:menu="@menu/navigation_drawer_items">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@color/grey_200"
        android:orientation="vertical">

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:background="@color/grey_600"/>

        <com.facebook.share.widget.LikeView
            android:id="@+id/like_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:padding="@dimen/small"/>

        <com.facebook.login.widget.LoginButton
            android:id="@+id/login_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/small"/>
    </LinearLayout>
</android.support.design.widget.NavigationView>

Stellen Sie dann die untere Polsterung auf NavigationMenuView ein

final View menuView = navigationView.getChildAt(0);
final View bottomView = navigationView.getChildAt(1);
bottomView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            menuView.setPadding(0, 0, 0, bottomView.getMeasuredHeight());
        }
    });

2

Versuchen Sie das, diese Arbeit für mich.

<android.support.design.widget.NavigationView
                    android:id="@+id/nav_view1"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_gravity="start"
                    android:fitsSystemWindows="true">

                    <ScrollView
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:orientation="vertical">

                        <android.support.design.widget.NavigationView
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent"
                            android:id="@+id/nav_view"
                            app:headerLayout="@layout/nav_header_admin"
                            app:menu="@menu/activity_admin_drawer"/>

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:orientation="vertical"
                            android:id="@+id/lyNavFooter">

                           <!--INCLUDE YOUR FOOTER HERE -->

                        </LinearLayout>
                    </LinearLayout>

                    </ScrollView>



                </android.support.design.widget.NavigationView>

1

Ich benutze dieses Formular, arbeite für mich. in Landschaft & Porträt.

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:headerLayout="@layout/master_main_header"
            app:itemIconTint="@color/blue"
            app:menu="@menu/menu_drawer">

        </android.support.design.widget.NavigationView>

        <Button
            android:id="@+id/master_btn_closession"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="@color/blue"
            android:text="Cerrar sesión" />
    </LinearLayout>
</android.support.design.widget.NavigationView>

1

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:scrollbars="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.NavigationView
                android:id="@+id/nav_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:elevation="0dp"
                app:headerLayout="@layout/nav_header_main"
                app:menu="@menu/activity_main_drawer">
                ></android.support.design.widget.NavigationView>

            <LinearLayout
                android:id="@+id/spacer_to_bottom"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:orientation="vertical" />

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="0dp">

        <include layout="@layout/nav_footer_main" />

    </LinearLayout>
</android.support.design.widget.NavigationView>


1
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft

2
Ich habe die Lösung. Sie müssen ein statisches Layout für die Fußzeile in die <android.support.design.widget.NavigationView>...</android.support.design.widget.NavigationView>. Für weitere Informationen überprüfen Sie bitte github repocitory ( github.com/mehul0/AndroidSidemenuFooterExample-master )

1

Dies funktioniert für mich, um Bilder in die Fußzeile der Navigationsschublade zu setzen (Hoch- und Querformat).

    <?xml version="1.0" encoding="utf-8"?>
        <android.support.v4.widget.DrawerLayout 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"
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            tools:openDrawer="start">

            <include
                layout="@layout/app_bar_main3"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

            <android.support.design.widget.NavigationView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:background="#f00"
                android:fitsSystemWindows="true"
                app:menu="@menu/activity_main3_drawer">

                <android.support.v4.widget.NestedScrollView
                    android:layout_width="match_parent"
                    android:fillViewport="true"
                    android:layout_height="match_parent"
                    android:scrollbars="vertical">

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical">

                        <android.support.design.widget.NavigationView
                            android:id="@+id/nav_view"
                            app:elevation="0dp"
                            android:layout_height="wrap_content"
                            android:layout_width="match_parent"
                                android:background="#ff0"
                            app:headerLayout="@layout/nav_header_main3"
                            app:menu="@menu/activity_main3_drawer">
                            ></android.support.design.widget.NavigationView>

                        <LinearLayout
                            android:id="@+id/spacer_to_bottom"
                            android:layout_width="match_parent"
                            android:orientation="vertical"
                            android:background="#0f0"
                            android:layout_height="0dp"
                            android:layout_weight="1">
                            <include layout="@layout/nav_footer_main3"></include>
                        </LinearLayout>


                    </LinearLayout>
                </android.support.v4.widget.NestedScrollView>
            </android.support.design.widget.NavigationView>

        </android.support.v4.widget.DrawerLayout>

mein nav_footer_main3 ist

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="60dp">
        <ImageView
            android:id="@+id/imageView"
            android:layout_gravity="center_horizontal"
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="@drawable/logo_1" />
    </LinearLayout>

1

Die Layoutstruktur für klebrige Kopf- und Fußzeilen im Schubladenmenü:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout>

    <android.support.design.widget.AppBarLayout>
        <android.support.v7.widget.Toolbar/>
    </android.support.design.widget.AppBarLayout>

    <LinearLayout>
        <include layout="@layout/drawer_header"/>
        <android.support.design.widget.NavigationView/>
        <include layout="@layout/drawer_footer"/>
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

Das komplette Layout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" >
        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:layout_gravity="start"
        android:orientation="vertical">
        <include layout="@layout/drawer_menu_header"/>

        <android.support.design.widget.NavigationView
            android:id="@+id/drawer_menu_body"
            app:elevation="0dp"
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:background="@color/white"
            android:theme="@style/AppTheme.PopupOverlay"
            app:menu="@menu/main_drawer">
        </android.support.design.widget.NavigationView>

        <include layout="@layout/drawer_menu_footer"/>
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

1

Versuchen Sie das, diese Arbeit für mich.https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Sie können jedoch NavigationViewScrolling deaktivieren, um einen reibungsloseren Bildlauf zu ermöglichen

private void disableNavigationViewScrolling(NavigationView navigationView) {
    if (navigationView != null) {
        NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);
        if (navigationMenuView != null) {
            navigationMenuView.setNestedScrollingEnabled(false);
        }
    }
}

Screenshots:


0

Scrolling-Fußzeile für Version> 23.xx.

Ich habe es endlich geschafft, das zu erreichen, was ich wollte. Leider scheint es nicht mehr möglich zu sein, einfach den Verweis auf die ListView zu greifen und eine Kopf- und Fußzeile wie in den Versionen unter 23.xx (wie von Andrea Baccega beschrieben) hinzuzufügen. Dies für den Header zu tun ist weiterhin möglich:

     <android.support.design.widget.NavigationView
     ..
     app:headerLayout="@layout/item_drawer_footer"
     ..
     />

Das Hinzufügen einer Fußzeile ist derzeit jedoch nicht möglich. Ich habe jedoch eine Problemumgehung gefunden, falls Sie nur versuchen, eine Fußzeile hinzuzufügen: Sie kehren einfach die Ansicht um. Dadurch wird die Kopfzeile unten hinzugefügt, die sich wie eine normale Fußzeile verhält. Stellen Sie einfach sicher, dass Sie Ihr Menü in umgekehrter Reihenfolge erstellen

    // Grab reference to the embedded recycler view
    RecyclerView mRecyclerView = (RecyclerView) navigationView.getChildAt(0);

    // Create a LinearLayoutManager and set it to reversed
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setReverseLayout(true);

    // Apply layout manager to the recycler view
    mRecyclerView.setLayoutManager(mLayoutManager);

0

Meine persönliche Lösung für feste Kopf- und Fußzeilen besteht darin, NavigationView wie folgt zu erweitern:

/**
 * Created by guness on 17.01.2018.
 */
class NavigationView : android.support.design.widget.NavigationView {

private var mHeader: View? = null
private var mFooter: View? = null
private var mMenuView: NavigationMenuView? = null

constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    val a = TintTypedArray.obtainStyledAttributes(context, attrs,
            R.styleable.NavigationView, defStyleAttr,
            R.style.Widget_Design_NavigationView)

    if (a.hasValue(R.styleable.NavigationView_footerLayout)) {
        inflateFooterView(a.getResourceId(R.styleable.NavigationView_footerLayout, 0))
    }

    a.recycle()

    (mFooter?.layoutParams as FrameLayout.LayoutParams?)?.gravity = Gravity.BOTTOM
}

init {
    (0 until childCount)
            .map { getChildAt(it) }
            .filter { it is NavigationMenuView }
            .forEach {
                mMenuView = it as NavigationMenuView
                mMenuView!!.overScrollMode = View.OVER_SCROLL_NEVER
            }
}

override fun inflateHeaderView(@LayoutRes res: Int): View {
    mHeader = LayoutInflater.from(context).inflate(res, this, false)
    setHeaderView(mHeader!!)
    return mHeader!!
}

@Deprecated("There can only be one header", ReplaceWith("#setHeaderView(view: View)"))
override fun addHeaderView(view: View) {
    throw IllegalAccessException("Please use #setHeaderView")
}

@UiThread
fun setHeaderView(view: View) {
    removeHeaderView()
    mHeader = view
    addView(mHeader, 0)
}

@Deprecated("No need to use params", ReplaceWith("#removeHeaderView()"))
override fun removeHeaderView(view: View) {
    removeHeaderView()
}

@UiThread
fun removeHeaderView() {
    if (mHeader != null) {
        removeView(mHeader)
        mHeader = null
    }
}

@Deprecated("No need to count, it is either 1 or zero", ReplaceWith("#hasHeader()"))
override fun getHeaderCount(): Int {
    return if (mHeader == null) 0 else 1
}

@Deprecated("No need to use params", ReplaceWith("#getHeaderView()"))
override fun getHeaderView(index: Int): View? {
    return getHeaderView()
}

fun getHeaderView(): View? {
    return mHeader
}

fun hasHeader(): Boolean {
    return mHeader != null
}

fun inflateFooterView(@LayoutRes res: Int): View {
    mFooter = LayoutInflater.from(context).inflate(res, this, false)
    setFooterView(mFooter!!)
    return mFooter!!
}

@UiThread
fun setFooterView(view: View) {
    removeFooterView()
    mFooter = view
    addView(mFooter, 0)
}

@UiThread
fun removeFooterView() {
    if (mFooter != null) {
        removeView(mFooter)
        mFooter = null
    }
}

fun hasFooter(): Boolean {
    return mFooter != null
}

fun getFooterView(): View? {
    return mFooter
}

fun setOnClickListener(@IdRes res: Int, listener: View.OnClickListener) {
    mHeader?.findViewById<View>(res)?.setOnClickListener(listener)
    mFooter?.findViewById<View>(res)?.setOnClickListener(listener)
}

override fun onMeasure(widthSpec: Int, heightSpec: Int) {
    super.onMeasure(widthSpec, heightSpec)
    val headerHeight = mHeader?.measuredHeight ?: 0
    val footerHeight = mFooter?.measuredHeight ?: 0
    val params = (mMenuView?.layoutParams as ViewGroup.MarginLayoutParams?)
    var changed = false
    if (params?.topMargin != headerHeight) {
        params?.topMargin = headerHeight
        changed = true
    }
    if (params?.bottomMargin != footerHeight) {
        params?.bottomMargin = footerHeight
        changed = true
    }
    if (changed) {
        mMenuView!!.measure(widthSpec, heightSpec)
    }
}
}

Ursprünglich erstellt NavigationView ein LinearLayout als erstes Element in RecyclerView und scrollt den gesamten Inhalt zusammen. Die Idee dabei ist, separate Ansichten für Fußzeile und Kopfzeile zu erstellen und diese dann mithilfe der Schwerkraft nach oben und unten zu verschieben. Später misst das Messen des Inhalts für RecyclerView den Bildlaufinhalt.

Hier ist die Bibliothek, die den obigen Code enthält, den ich geschrieben habe. https://github.com/guness/NavigationView

Gute Seite davon, jetzt kann ich die Fußzeilenansicht auf der XML genau wie die Kopfzeile auf native definieren:

    app:footerLayout="@layout/nav_footer_main"
    app:headerLayout="@layout/nav_header_main"

0

Hier ist eine Lösung, die keine Verschachtelung erfordert und die den unteren Abstand der internen NavigationMenuView basierend auf der eigenen Höhe der Fußzeilenansicht dynamisch anpasst. Dies bedeutet, dass die Fußzeilenhöhe auf eingestellt werden kann wrap_contentund Sie die Sichtbarkeit der Fußzeile dynamisch auf VISIBLEoder ändern können GONE.

public class NavigationMenuFooterView extends LinearLayout {

    public NavigationMenuFooterView(Context context) {
        super(context);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
        update(getHeight());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        update(h);
    }

    private void update(int height) {

        ViewParent parent = getParent();
        if (parent instanceof ViewGroup) {
            View navigationMenuView = ((ViewGroup) parent).findViewById(R.id.design_navigation_view);
            if (navigationMenuView != null) {
                if (getVisibility() == View.GONE) {
                    height = 0;
                }
                navigationMenuView.setPadding(navigationMenuView.getPaddingLeft(),
                        navigationMenuView.getPaddingTop(), navigationMenuView.getPaddingRight(), height);
            }
        }
    }
}

Sie müssen die ID von design_navigation_view in Ihrer ids.xml definieren:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="design_navigation_view" type="id"/>
    </resources>

Und verwenden Sie wie folgt:

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:itemBackground="@drawable/drawer_item"
        app:itemIconTint="@color/drawer_item"
        app:itemTextColor="@color/drawer_item"
        app:menu="@menu/menu_drawer">

        <util.NavigationMenuFooterView
            android:id="@+id/navigation_footer_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="#fff"
            android:orientation="vertical">

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#ddd" />

            <include layout="@layout/..." />

        </util.NavigationMenuFooterView>

    </com.google.android.material.navigation.NavigationView>

Getestet mit com.google.android.material:material:1.0.0.


0

Wenn Sie die Listenansicht verwenden, können Sie dies auf diese Weise versuchen. Die Listenansicht unterstützt die Funktion zum Hinzufügen der Fußzeile, sodass Sie eine benutzerdefinierte Fußzeilenansicht R.layout.drawer_footer hinzufügen können, indem Sie das Listenansichtsobjekt wie folgt verwenden

View footerView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.drawer_footer, expandableListView, false);
TextView footer = footerView.findViewById(R.id.id_footer_wta_version_information);
expandableListView.addFooterView(footerView);

In meinem Fall verwende ich expandableListView anstelle von listview (die listview hat auch die Funktion addFooter). Hoffe dieser Weg hilft dir


-1

Fügen Sie diese Zeilen in Ihr Menü-Layout ein. Ich hoffe, es wird Ihr Problem beheben:

    <group
        android:id="@+id/grp11"
        android:checkableBehavior="single">

        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />
        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />

    </group>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.