【问题标题】:How to use menu and ListView simultaneously in a Navigation View如何在导航视图中同时使用菜单和 ListView
【发布时间】:2023-03-11 19:21:01
【问题描述】:

我已经创建了一个导航视图,其中一个动态列表是在运行时根据从服务器检索到的数据创建的。它工作正常,并在与服务器成功通信后显示列表。问题是我无法将“设置”和“关于我们”等项目添加到列表底部。以下布局 (activity_main.xml) 导致菜单项覆盖列表视图项:

<?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"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:elevation="@dimen/padding"
        app:menu="@menu/navigation_items"

        >

        <android.support.v7.widget.ListViewCompat
            android:id="@+id/categories_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:layout_gravity="center"
            android:layout_marginStart="@dimen/margin_side"
            android:layout_marginLeft="@dimen/margin_side"
            android:layout_marginTop="@dimen/nav_header_height"
            android:layout_marginBottom="48dp"
            />


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


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

这是navigation_items.xml(菜单资源)的内容:

<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/nav_bottom"
    android:orderInCategory="0">
    <item
        android:id="@+id/settings"
        android:icon="@drawable/settings"
        android:title="@string/settings" />
    <item
        android:id="@+id/about_us"
        android:icon="@drawable/info"
        android:title="@string/about_us" />


</group>
</menu>

模拟器上的结果如下:

【问题讨论】:

  • 你不能在列表中添加菜单项而不是app:menu="@menu/navigation_items"。像列表视图一样最初带有默认项目,当您有新项目时使用列表视图显示它们
  • 能否请您发布您的 Java 代码。
  • 是的,没关系,我只是说将其他 Views 直接粘贴在 NavigationView 中几乎总是会变得不稳定。您仍然可以将这两样东西放在抽屉里,只需将它们放在另一个充当抽屉的ViewGroup 中即可。抽屉可以是任何类型的ViewViewGroup。它不一定是NavigationView。这正是新模板默认放置的内容。您只需要确保抽屉View 具有layout_gravity 属性。
  • 我不确定你的整体设计到底是什么,所以我真的不能说,但我认为把这两样东西都放在你的抽屉里没有什么问题。
  • @JasonStack 不,我使用带有标题和其他视图类型的 recyclerview 创建了一个项目,并使用了 ScrimInsetsRelativeLayout 并将设置放在底部和 recyclelview 上方。但这需要大量代码,而还有其他方法可以实现与已经提到的相同的方法,您可以将 recyclerview 移到导航视图之外。将它们都包裹在 RelativeLayout 中。您也可以在底部添加一些阴影

标签: android listview menu navigationview


【解决方案1】:

实现你想要的最简单的方法是

<com.example.raghu.drawersample.ScrimInsetsRelativeLayout
    android:layout_width="320dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@android:color/white"
    android:fitsSystemWindows="true">

    <android.support.design.widget.NavigationView
        android:layout_alignParentBottom="true"
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/activity_main_drawer" />

    <android.support.v7.widget.RecyclerView
       android:layout_above="@+id/nav_view"
        android:id="@+id/item_list"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:scrollbars="vertical" />

</com.example.raghu.drawersample.ScrimInsetsRelativeLayout>

ViewGroup没有setNavigationItemSelectedListener,那怎么办 可以代替 NavigationView 使用吗?另外,如何嵌入菜单 在 ViewGroup 内?

您只是将NavigationViewListView/RecyclerView 包装在RelativeLayout

使用 RecyclerView 还是 ListView 由您决定。可以正常使用navigationView.setNavigationItemSelectedListener(this)

https://github.com/mikepenz/Materialize/blob/develop/library/src/main/java/com/mikepenz/materialize/view/ScrimInsetsRelativeLayout.java 中挑选 ScrimInsetsRelativeLayout 代码

我之所以使用它,是因为我在 recylerview 中添加了一个标题,并且我希望状态栏看起来与下图中的完全一样。

你最终得到

我不确定将“设置”附加到我的列表视图是否是个好主意

另一种方法是将您的设置项作为页脚添加到您的回收站视图中。您可以在 gmail 中看到这种模式。我不确定为什么这不是一个好主意。如果您有更多项目,用户仍需要向下滚动。

在底部固定页脚(设置和帮助),顶部有阴影是您在收件箱应用程序中看到的。

【讨论】:

  • 感谢您的回答。将 ScrimInsetsRelativeLayout.java 添加到我的代码会导致几个未解决的依赖关系。我该如何解决?还有一个问题,为什么不能使用简单的RelativeLayout?
  • @JasonStack 你可以使用 relativeLayout。我希望标题也覆盖状态栏。所以我使用了RelativeLayout。对于您的情况,我想只使用RelativeLayout 是可以的
  • 我在 ScrimeInsetsRelativeLayout 的代码中有错误。我无法让它工作。我可能会考虑在另一个活动中而不是在抽屉中进行过滤。
  • @JasonStack 为什么不使用RelativeLayout。此外,错误是因为您没有从喜欢的存储库中复制 attrs.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多