web-dev-qa-db-fra.com

Comment ajouter un pied de page à NavigationView - Bibliothèque de conception de support Android?

Comment définir les paramètres de pied de page et les éléments de profil sur NavitationView? ressembler à la boîte de réception par le tiroir de navigation par courrier électronique. Les éléments NavitationView sont gonflés par ressource de menu, mais je ne sais pas comment définir les éléments inférieurs en ressource de menu, ni comment définir une vue personnalisée sur NavigationView ou un décalage inférieur? J'ai essayé de placer ce <LinearLayout...> en tant que vue de pied de page, mais sur de petits écrans, le pied de page recouvre les éléments et je ne peux pas faire défiler le menu. J'ai essayé de définir un remplissage de pied de page sur NavigationView.

Ce n'est pas défiler sur de petits écrans:

<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

Cela fait défiler, mais le pied de page est sur les éléments de menu:

<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

Fichier tiroir res/menu/drawer.xml fichier:

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

Si vous souhaitez un pied de page fixe (sans défilement) dans votre menu de navigation, vous devez entourer NavigationView d’une autre mise en page, comme vous l’aviez publiée. NavigationView fonctionne comme FrameLayout. Ainsi, cela finit par "empiler" la disposition interne au-dessus des éléments de menu NavigationView. Voici un moyen de l'organiser en utilisant LinearLayout pour les éléments de pied de page:

Pied de page fixe

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

J'ai utilisé TextViews dans cet exemple, mais vous pouvez utiliser ce que vous voulez pour les vues de pied de page. Pour éviter que les éléments de bas de page ne se chevauchent avec le bas du menu, ajoutez des éléments factices à la fin de votre fichier de ressources de menu (ils agiront comme des "espaceurs"):

res/menu/tiroir.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>

Enfin, n'oubliez pas d'ajouter des écouteurs de clic dans votre activité pour les vues de pied de page réelles:

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

Pied de page défilant

Si vous autorisez le défilement du pied de page avec le reste de NavigationView, cela simplifie les choses (pas de dispositions supplémentaires ni d'écoute de clic). Ajoutez simplement les éléments de pied de page au fichier de ressources de votre menu en tant que <group> unique (cela créera une séparateur de ligne ), et tout sera traité automatiquement et défilera ensemble:

res/menu/tiroir.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

Je vais juste vous donner un indice sur la façon de le résoudre, mais je n'ai aucune chance de le tester sur NavigationView, et je suis à peu près sûr que cela fonctionnera. 

voici l'exemple de mise en page 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>

voici le résultat:

enter image description here

l'astuce consiste à appliquer un rembourrage au parent et une marge moins à l'enfant.


Essai rapide:

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

Suivant les approches décrites dans les autres réponses relatives aux vues de navigation imbriquées, certains problèmes se sont posés:

  • Avec de nombreux éléments, ou en mode paysage, le pied de page se superposait aux éléments de menu.
  • Si le menu réel contient de nombreux éléments, le navigateur imbriqué NavigationView pouvait défiler, ce qui ne ressemblait pas à Nice.
  • Avoir deux NavigationViews dans l'imbrication, ne permettait pas de définir des vues personnalisées comme pied de page.
  • La gestion des vues de défilement imbriquées était un désordre (parfois deux barres de défilement apparaissaient, etc.)
  • Le pied de page fixe doit toujours être en bas (avec quelques éléments de menu et plusieurs éléments de menu)

Ma solution à tous ces problèmes était la suivante:

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

Ici, NestedScrollView agit en tant que parent de défilement pour le sous-NavigationView ..__, ce qui signifie que le sous-NavigationView n’affiche jamais les barres de défilement, mais tout le contenu est affiché de manière plate.

La disposition 'spacer_to_bottom' remplit tout l'espace restant. Ainsi, avec quelques icônes de menu, le pied de page est toujours en bas.

Enfin, le pied de page fixe est ajouté à la mise en page linéaire, qui commence par le menu réel (sous-NavigationView), l’espaceur et le bas de la page.

Vous trouverez ici l'exemple complet de travail sous AndroidStudio-Project: https://github.com/MarcDahlem/AndroidSidemenuFooterExample

Vous pouvez trouver le tiroir de navigation en particulier ici: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Captures d'écran:

 Few items  Many items

23
Adreamus

La réponse la plus simple consiste à ajouter un bouton à l'intérieur de la disposition du tiroir et à définir la gravité au plus bas dans le navigationview.xml.

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

Vous devez disposer d'une disposition de vue de navigation par conteneur, puis de deux autres dispositions de navigation. Vous les alignez en haut et en bas de la disposition parent. 

Je recommanderais d'utiliser une vue de navigation en tant que parent et non pas FrameLayout, car il s'agit essentiellement d'un ScrimFrameLayout et permet une meilleure interaction avec la barre d'état.

Voici un exemple de ce à quoi votre activité devrait ressembler:

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

Vous pouvez en savoir plus à ce sujet et voir un exemple ici: http://blog.nitish.io/post/122633295558/Android-design-library-navigationview-with-top

16
Nitish Kasturia

C'est un peu dommage que NavigationView n'ait pas de disposition pour ajouter un pied de page. Mais vous pouvez essayer quelque chose comme ça,

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

Au cas où votre pied de page est une liste,

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

Mais, s'il s'agit d'une sorte de vue personnalisée,

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

De plus, dans ce cas, vous devrez définir x = height of your custom footer view

J'espère que ça aide.

10
Jay Nair

Suivant votre approche, quelques modifications mineures peuvent vous aider à atteindre vos objectifs.

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

Et définissez certains éléments de stub dans le menu, de sorte que les éléments de menu ne se chevauchent pas.

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

Aussi, vous voudriez ajouter un écouteur de clic à votre élément de pied de page.

6
razzledazzle

NavigationView first child est la ListView contenant les éléments d'en-tête et de menu.

La seule chose nécessaire pour ajouter un pied de page est d'appeler .addFooterView à ListView

Plus d'infos: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

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

Je connais sa réponse tardive, mais sa réponse parfaite et précise que recherchent la plupart des développeurs.

Pour ajouter un pied de page en vue de navigation, ajoutez une vue personnalisée au menu de navigation comme ci-dessous:

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>

Maintenant, ajoutez la vue ci-dessus dans votre menu XML avec l'attribut de groupe. Ainsi, il peut se différencier en pied de page dans le menu.

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>

C'est tout. Ci-dessous est la sortie:

 enter image description here

5
Riser

Ma solution avec pied de page fixe et menus déroulants (testé à 100%)

 <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

Voici comment je parviens à ajouter une mise en page au bas de la navigation:

    <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

J'ai fait la même chose de la manière suivante

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

Ici, l’essentiel est que j’ai mis la mise en page au bas, par exemple.

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

11

2
Manjeet Singh Goyal

J'utilise ce formulaire, travaille pour moi. en paysage et portrait.

<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

utilisez ceci..

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

puis définissez le remplissage inférieur sur 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
OM PRAKASH SEERVI

Essayez ceci, ce travail pour moi.

<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

Il suffit de mettre une autre disposition dans votre NavigationView:

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

L'astuce consiste à utiliser layout_gravity = "bottom" - cela mettra toute votre mise en page en bas et test, test2 sont correctement empilés.

2
McOzD

Essayez ceci, ce travail pour moi . https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Cependant, vous devez désactiver NavigationViewScrolling pour un défilement plus fluide

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

Captures d'écran:

1
JB Pha Le

La structure de présentation de l'en-tête et du pied de page collants dans le menu Tiroir:

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

La mise en page complète:

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

Cela fonctionne pour moi pour mettre des images sur le pied de page du tiroir de navigation (orientation portrait et paysage) 

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

mon nav_footer_main3 est 

    <?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
Sengson Haang Rai

Ma solution personnelle pour l'en-tête et le pied de page fixes étend NavigationView comme suit:

/**
 * 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)
    }
}
}

À l'origine, NavigationView créait LinearLayout en tant que premier élément de RecyclerView et faisait défiler tout le contenu. L’idée est de créer des vues distinctes pour le pied de page et l’en-tête, puis de les pousser en haut et en bas à l’aide de Gravity. Plus tard, la mesure du contenu de RecyclerView règle le contenu défilant.

Voici la bibliothèque qui contient le code ci-dessus que j'ai écrit . https://github.com/guness/NavigationView

Bon côté de ceci, je peux maintenant définir la vue de pied de page sur le xml, tout comme l’en-tête sur le fichier natif:

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

Pied de page défilant pour Version> 23.x.x

J'ai finalement réussi à obtenir ce que je voulais. Malheureusement, il semble qu'il n'est plus possible de simplement saisir la référence à ListView et d'ajouter un en-tête et un pied de page comme dans les versions inférieures à 23.x.x (comme décrit par Andrea Baccega). Cela est toujours possible pour l'en-tête:

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

Mais ajouter un pied de page n'est pas possible pour le moment. Cependant, j'ai trouvé une solution de contournement au cas où vous essayez simplement d'ajouter un pied de page: vous inversez simplement la vue, cela ajoutera l'en-tête au bas qui se comporte comme un pied de page normal. Assurez-vous simplement de créer votre menu dans l'ordre inverse

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