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>
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>
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>
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>
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:
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>
Suivant les approches décrites dans les autres réponses relatives aux vues de navigation imbriquées, certains problèmes se sont posés:
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
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>
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
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.
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.
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);
}
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:
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>
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>
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"**
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>
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());
}
});
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>
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.
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);
}
}
}
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>
<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>
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>
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"
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);