如何在Android支持设计库中为NavigationView添加页脚?

140
我该如何设置页脚和个人资料信息,使其在 NavigationView 中呈现像电子邮件导航抽屉中的收件箱一样的效果?NavigationView 的项是通过菜单资源充气的,但我不知道如何将底部项设置为菜单资源,或者如何将自定义视图设置为 NavigationView 或底部偏移量?我尝试将此 <LinearLayout...> 作为页脚视图放置,但在小屏幕上,页脚会覆盖项目,我无法滚动菜单。我尝试为 NavigationView 设置页脚填充,但页脚也会占用填充。

这在小屏幕上无法滚动:

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

不滚动

这个可以滚动,但页脚覆盖了菜单项:

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

在此输入图片描述

抽屉式菜单的res/menu/drawer.xml文件:

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

你把@menu/drawer文件放在哪个位置了? - Psypher
它在 /res/menu/drawer.xml 中。 - epool
你不能把“反馈”和“退出”作为菜单项吗?如果原因是你想动态更改“退出”菜单图标,那么你应该可以使用menuItem.setIcon(Drawable)来实现。 - hungryghost
这只是为了满足需求,个人想知道例如 Google 在 Inbox 应用中是如何实现的。 - epool
这个问题在23.1更新后变得更加重要。 - Alex Sorokoletov
27个回答

174

如果您想在导航菜单中拥有固定的(非滚动)页脚,您需要将NavigationView包装在另一个布局周围,就像您发布的那样。 NavigationView的工作方式类似于FrameLayout,因此这最终会将内部布局堆叠在NavigationView菜单项上面。以下是一种排列它的方法,使用LinearLayout进行页脚项目:

固定页脚

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

在此示例中,我使用了TextViews,但是您可以使用任何您想要的内容作为页脚视图。为了避免页脚项目与菜单底部重叠,请在菜单资源文件的末尾添加一些虚拟项(这些项将充当“间距”):

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>

最后,在您的活动中为实际页脚视图添加点击监听器,不要忘记:

最后,在您的活动中为实际页脚视图添加点击监听器,不要忘记:

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

滚动页脚

如果您允许页脚与NavigationView的其余部分一起滚动,那么事情就变得更加简单(无需额外的布局或点击监听器)。只需将页脚项目作为独特的<group>添加到您的菜单资源文件中(这将创建一个分隔线),一切都将自动处理并一起滚动:

res/menu/drawer.xml

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

1
这只是为了满足需求,个人想知道Google在Inbox应用中是如何实现的。 - epool
我不确定谷歌在 Gmail 应用程序中是如何做到的,但从外观上看,它看起来就像我在答案中所描述的那样。如果您想要一个分隔线,请使用单独的 <group>,否则 Gmail 应用程序的导航页脚看起来就像普通的菜单项(至少对我来说是这样)。 - hungryghost
1
啊,我明白了。我以为你在谈论 Gmail 应用程序。我还没有安装 Inbox 应用程序,但如果你正在寻找一个静态页脚,那么你是对的,你必须使用单独的布局。不过这应该不难。让我们看看... - hungryghost
8
dimen.xml中使用<dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen>代替在菜单中使用虚拟项!完美! - Pejman
1
我该如何设置抽屉项目的字体和底部TextView的字体大小? - JEGADEESAN S
显示剩余8条评论

39

我只会给你一个解决方法的提示,但我没有测试过在NavigationView上是否可行,不过我非常确信它会起作用

这是样例的layout 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>

这是结果:

enter image description here

关键是通过给父元素应用内边距和给子元素应用负外边距来实现。


快速尝试:

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

在此输入图片描述


3
这个方法可能可行,但是负边距的实现方式有些不正规。所以,就我个人而言,如果可以避免使用负边距,我会尽量避免。 - hungryghost
如果您将图标放在底部中心,此页脚可以根据屏幕更改,并且会被截断。请参见此帖子http://stackoverflow.com/questions/32460312/recycleview-header-all-in-one-header-listview-footer。 - user3402040
你能提供一个完整示例的链接吗? - user3402040
我们可以将其设置为可滚动的吗? - Ahmad Shahwaiz

33

在遵循其他答案中描述的嵌套导航视图方法时,出现了一些问题:

  • 如果有很多项目,或在横屏模式下,页脚会与菜单项重叠
  • 如果真正的菜单有很多项,嵌套的NavigationView会变得可以滚动,这样看起来不好看
  • 在嵌套中有两个NavigationView,无法定义自定义视图作为页脚。
  • 处理嵌套滚动视图很混乱(有时会出现两个滚动条等)
  • 固定页脚应始终位于底部(无论菜单项少或多)

我对所有这些问题的解决方案如下:

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

在这里,NestedScrollView充当子NavigationView的滚动父级。 这意味着,子NavigationView从不显示滚动条,而是以平面方式显示所有内容。

布局'spacer_to_bottom'填充所有剩余空间,因此即使有少量菜单图标,页脚仍在底部。

最后,固定页脚被添加到线性布局中,该布局以真正的菜单(子NavigationView)开头,然后是间隔符,在底部有页脚。

在此处您可以找到完整的AndroidStudio项目示例:https://github.com/MarcDahlem/AndroidSidemenuFooterExample

尤其是导航抽屉可以在此处找到: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

截图:

Few items Many items


具体是哪里出了问题?如果需要,我可以提供一个示例项目,它可以很好地与滚动页脚配合使用。@AndreaBaccega - Adreamus
我同意@AndreaBaccega的观点,它不起作用,只显示导航菜单,而不显示页脚。 - RdlP
好的,第二个有问题。我会创建一个示例项目并将其上传到Github。待会见。 - Adreamus
我在Github上添加了一个示例项目:https://github.com/MarcDahlem/AndroidSidemenuFooterExample - Adreamus
1
对于elevation属性的大力点赞。我一开始也是采用同样的方法,但无法去除底部阴影。后来我找到了这个方法。谢谢! - Elvedin Selimoski
显示剩余2条评论

27

最简单的答案是在 Drawer 布局中添加一个按钮,并将其重力设置为底部在 navigationview.xml 中。

以下是代码:

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

2
对于少量的菜单项目,这种方法也许可行。但是一旦有很多菜单项目,在小设备或横屏模式下,按钮就会与菜单项目重叠。 - Adreamus
1
然而,为了克服这个问题,您可以添加空菜单项。 - Mohammed Fadhl
将不同屏幕尺寸下的空菜单项与底部对齐几乎是可能的。但是,有一种通用的方法可以通过我在解决方案中描述的方式来实现;-) --> 请查看我的解决方案https://dev59.com/o10a5IYBdhLWcg3wRGrp#37714353 - Adreamus

23

我知道答案晚了,但这是大多数开发人员正在寻找的完美准确答案。

要在导航视图中添加页脚,请像下面这样将自定义视图添加到导航菜单中:

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>

现在,在菜单xml中添加上述视图,并使用group属性将其区分为菜单的底部。

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>

就是这样。下面是输出:

在此输入图像描述


如果底部视图比较复杂,它将无法正常工作,因为它会给底部视图一个固定的高度。 - Akash Bisariya
可能会起作用,但是无法为页脚布局中的视图设置onClickListeners...在我的情况下,我在页脚上有社交媒体按钮,发送到外部URL,但无论如何都无法使用它们的ID获取视图... - Ramiro G.M.
1
@RamiroG.M. nav_view.getMenu().findItemById().getActionView().findViewById().setOnClickListener。 - Irfan Ul Haq
是的,@Sagar Maiyad你的答案很准确,大多数开发人员都想要这个。为了在自定义布局中获取视图,您可以使用以下代码: View footerView = nav_view.getMenu().findItem(R.id.footer).getActionView(); TextView licence = footerView.findViewById(R.id.licence); TextView version = footerView.findViewById(R.id.version); - Suman

17
你需要拥有一个容器导航视图布局,然后该布局应包含另外两个导航布局。你需要将它们与父布局的顶部和底部对齐。
我建议使用导航视图作为父视图而不是FrameLayout,因为它本质上是ScrimFrameLayout并且与状态栏更好地交互。
以下是你的活动应该看起来像的示例:
<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>

您可以在这里阅读更多相关信息并查看示例:http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top


1
这确实是一个不错的解决方案。但是 wrap content 在顶部和底部 NavigationView 上都无法正常工作。您必须给一些常量高度以防止底部 NavigationView 阻塞顶部 NavigationView。 - Olcay Ertaş
完美解决方案 - Bolein95
@Nitish,如何在“@+id/navigation_drawer”在纵向模式下有更多值时避免重叠。它会出现在底部导航视图后面。在我的情况下,顶部导航视图菜单项是动态生成的,而底部导航视图具有静态菜单值。 - MohanRaj S

15

NavigationView没有提供添加页脚的选项,这有点令人失望。但你可以尝试类似于以下的方法:

<?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>
如果您的页脚是一个列表,则:
    app:headerLayout="@null"
    app:menu="@menu/activity_base_drawer_footer"

但是,如果它是某种自定义视图,

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

同样,在这种情况下,您需要设置x = 您自定义页脚视图的高度

希望能对您有所帮助。


谢谢兄弟,你让我的一天变得美好.. :) - SiddharthG
3
3个NavigationView?为什么?是为了更糟糕的性能吗?请观看以下视频:https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE - Louis CAD
1
@LouisCAD 如果您有一個實際可行的解決方案,而不是使用負邊距,請與我們分享。我也遇到了這裡提到的問題,這是我唯一考慮的解決方案。也許它不是完美的解決方案,並且可能會對性能產生一些影響...但如果沒有其他實現方式,請不要只評論性能問題。首先,應用程序要求很重要。如果Google沒有為您的應用程序要求提供解決方案...您就沒有太多選擇。 - Dascalescu Vladut
我认为这是正确的做法。尝试了这里的不同答案,发现这个最有帮助。谢谢。 - Amir Dora.

12

输入图片描述我用以下方式做了同样的事情:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

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

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

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

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

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

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

重点是我将布局重力设置为底部,例如:

LinearLayout android:layout_gravity="bottom"

使用这个解决方案,底部视图将浮动在菜单项上(如果有多个菜单项)...但我希望它固定在底部。 - Akash Bisariya

8
这是我实现在导航栏底部添加布局的方法:

更新的库

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

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

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

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

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

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

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

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

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

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

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

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

这是在导航视图底部添加页脚布局的正确解决方案。虽然这个答案中不需要一个线性布局,但我已经进行了编辑。 - Akash Bisariya
你是如何在这个活动中设置导航项选择监听器的?@zohaib khaliq - Akash Bisariya
你需要将它附加到navView。 - user882290

7

按照您的方法,一些小改动可以帮助实现您想要达到的目标。

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

在菜单中设置一些占位项,以防止菜单项重叠。

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

此外,您还需要为页脚项目添加一个点击监听器。

谢谢你的回答,这给了我一个添加页脚的解决方法,但如果没有更好的答案,我希望接受你的答案。+1 - epool
确实要保持您的选择开放。期待更好的答案,因为页脚非常重要。 - razzledazzle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接