wake-up-neo.com

Hinzufügen von Fußzeilen zu NavigationView - Android-Supportdesign-Bibliothek

Wie kann ich Fußzeileneinstellungen und Profilelemente auf NavitationView setzen? sieht aus wie der Posteingang per E-Mail-Navigation. Die NavitationView-Elemente werden von der Menüressource aufgebläht, aber ich weiß nicht, wie Sie die unteren Elemente auf eine Menüressource setzen oder wie kann ich eine benutzerdefinierte Ansicht auf NavigationView oder einen unteren Versatz einstellen? Ich habe versucht, diesen <LinearLayout...> als Fußzeilenansicht zu setzen, aber auf kleinen Bildschirmen legt die Fußzeile die Elemente über, und ich kann das Menü nicht scrollen. Ich habe versucht, eine Fußzeilenauffüllung auf NavigationView zu setzen.

Dies ist kein Bildlauf auf kleinen Bildschirmen:

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

NOT SCROLLING

Dies scrollt, aber die Fußzeile befindet sich ü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>

enter image description here

Schubladenmenü res/menu/drawer.xml Datei:

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

Wenn Sie eine feste (nicht scrollbare) Fußzeile in Ihrem Navigationsmenü haben möchten, müssen Sie die Navigationsansicht um ein anderes Layout wickeln, wie Sie es bereits geschrieben haben. NavigationView funktioniert wie FrameLayout, so dass das innere Layout oberhalb der Menüelemente von NavigationView "gestapelt" wird. Hier ist eine Möglichkeit, es mithilfe von LinearLayout für die Fußzeilenelemente anzuordnen:

Feste Fußzeile

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

Ich habe in diesem Beispiel TextViews verwendet, aber Sie können für die Fußzeilenansichten beliebig verwenden. Um zu vermeiden, dass sich die Fußzeilenelemente mit dem unteren Rand des Menüs überlappen, fügen Sie am Ende Ihrer Menüressourcendatei einige Dummy-Elemente hinzu (diese verhalten sich wie "Abstandhalter"):

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

Scroll-Fußzeile

Wenn Sie zulassen, dass die Fußzeile mit dem Rest der Navigationsansicht scrollen kann, wird die Sache einfacher (keine zusätzlichen Layouts oder Klicklisten). Fügen Sie der Menüressourcendatei einfach die Fußzeilenelemente als eindeutigen <group> hinzu (dies erstellt eine Trennlinie ), und alles wird automatisch behandelt und blättert zusammen:

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

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

hier die 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:

enter image description here

der Trick besteht darin, das Auffüllen auf das übergeordnete und den negativen Rand auf das untergeordnete Element anzuwenden.


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>

enter image description here

30
Mohammad Ersan

Nach den in den anderen Antworten der verschachtelten 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 eigentliche Menü viele Elemente enthält, wurde die verschachtelte NavigationView scrollbar, was nicht schön aussah
  • Mit zwei Navigationsansichten in der Schachtelung konnten keine benutzerdefinierten Ansichten als Fußzeile definiert werden.
  • Die Handhabung verschachtelter Bildlaufansichten war ein Durcheinander (manchmal wurden zwei Bildlaufleisten angezeigt usw.)
  • Die feste Fußzeile sollte immer unten sein (sowohl bei wenigen als auch bei vielen Menüpunkten)

Meine Lösung für alle diese Probleme war 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 Element für die Unter-NavigationView ..__, dh die Unter-NavigationView zeigt niemals Bildlaufleisten selbst an, der gesamte Inhalt wird jedoch flach dargestellt.

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ü (Unter-Navigationsansicht), dem Abstandhalter und der Fußzeile unten beginnt.

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

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

Screenshots:

 Few items  Many items

23
Adreamus

Die einfachste Antwort besteht darin, eine Schaltfläche in das Schubladenlayout einzufügen und die Schwerkraft im navigationview.xml auf die unterste Position zu setzen.

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>

here is the result

22
Mohamed Fadhl

Sie benötigen ein Layout für die Containernavigationsansicht, das dann zwei weitere Navigationslayouts enthalten sollte. Sie richten diese an dem oberen und unteren Rand des übergeordneten Layouts aus. 

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

Hier ist ein Beispiel, 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

16
Nitish Kasturia

Es ist eine Schande, 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>

Wenn Ihre Fußzeile eine Liste ist,

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

Aber wenn es eine Art benutzerdefinierte Ansicht ist,

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

In diesem Fall müssen Sie auch x = height of your custom footer view einstellen.

Ich hoffe es hilft.

10
Jay Nair

Wenn Sie Ihrem Ansatz folgen, können einige kleinere Änderungen helfen, 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>

Legen Sie einige Stub-Elemente im Menü fest, damit sich die Menüelemente nicht überlappen.

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

Außerdem möchten Sie Ihrem Fußzeilenelement einen Klicklistener hinzufügen.

6
razzledazzle

NavigationView erstes Kind ist die ListView, die sowohl Kopf- als auch Menüelemente enthält.

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

Weitere Informationen: http://www.andreabaccega.com/blog/2015/08/28/wie-zu-add-footer-nach-navigationsansicht/

Einfügecode kopieren: 

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);
  }
5
Andrea Baccega

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

Um eine Fußzeile in der Navigationsansicht hinzuzufügen, fügen Sie die benutzerdefinierte Ansicht wie folgt in das Navigationsmenü ein:

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 obere Ansicht in Ihr Menü-XML mit Gruppenattribut ein. So kann es 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 Ausgabe:

 enter image description here

5
Riser

Meine Lösung mit festen Fußzeilen- und Scroll-Menü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>
5
RD1819

So füge ich das Layout unten in der Navigation hinzu:

    <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.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fillViewport="true">

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

            <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:orientation="vertical"
                Android:weightSum="1">

                <Android.support.design.widget.NavigationView
                    Android:id="@+id/nav_view"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentTop="true"
                    Android:layout_gravity="top"
                    Android:layout_weight="0.8"
                    app:headerLayout="@layout/nav_header_home"
                    app:menu="@menu/activity_home_drawer" />

                <Android.support.design.widget.NavigationView
                    Android:id="@+id/navigation_drawer_bottom"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentBottom="true"
                    Android:layout_below="@+id/nav_view"
                    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>
                </Android.support.design.widget.NavigationView>
            </LinearLayout>
        </RelativeLayout>
    </Android.support.v4.widget.NestedScrollView>
</Android.support.design.widget.NavigationView>
2
zohaib khaliq

Das gleiche habe ich auf folgende Weise gemacht: __.

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

Die Hauptsache ist hier, dass ich die Layout-Schwerkraft nach unten stellte, z.

**LinearLayout Android:layout_gravity="bottom"**

11

2

Ich verwende dieses Formular und 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>
2
Alex Zaraos

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 den unteren Abstand auf NavigationMenuView

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 dies, 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>
2
RdlP

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 - das gesamte Layout wird unten angezeigt und test2 wird richtig gestapelt.

2
McOzD

Probieren Sie dies aus, 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 für glatteres Scrollen deaktivieren

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

Screenshots:

1
JB Pha Le

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

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

Dies funktioniert für mich, um Bilder in die Fußzeile der Navigationsleiste 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

Meine persönliche Lösung für feste Kopf- und Fußzeilen erweitert NavigationView wie folgt:

/**
 * 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 der RecyclerView und scrollt den gesamten Inhalt zusammen. Die Idee dabei ist, separate Ansichten für Fußzeile und Kopfzeile zu erstellen und diese dann mit Schwerkraft nach oben und unten zu verschieben. Durch das Messen des Inhalts für RecyclerView wird der Bildlaufinhalt festgelegt.

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 in der XML-Datei genauso wie die Kopfzeile in Native definieren:

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

Fußzeile für Version> 23.x.x scrollen

Ich habe es endlich geschafft, das zu erreichen, was ich wollte. Leider sieht es so aus, als wäre es nicht mehr möglich, den Verweis auf die ListView zu ziehen und eine Kopf- und Fußzeile wie in Versionen unter 23.x.x (wie von Andrea Baccega beschrieben) hinzuzufügen. Dies ist für die Kopfzeile immer noch möglich:

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

Das Hinzufügen einer Fußzeile ist momentan 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 am unteren Rand 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
Lukas