Android 实现滚动导航抽屉的最佳方法

Android 实现滚动导航抽屉的最佳方法,android,android-listview,scroll,navigation-drawer,Android,Android Listview,Scroll,Navigation Drawer,我一直在向我的一个应用程序添加导航抽屉,我开始怀疑是否最好从使用列表视图切换到使用多个文本视图s作为导航抽屉列表项。查看,我注意到使用多个TextViews可能会更好看 目前,我正在导航抽屉中使用列表视图和图像视图(看起来有点像。但是,当我在导航抽屉中滚动时(由于列表中的项目还不够,我通过旋转设备横向视图来实现这一点),只有列表视图滚动,而图像视图保持原样。我希望它能够像这样滚动 此外,我发现我的导航抽屉中的ListView没有连锁反应,尽管我的其他活动中的其他ListViews和Fragmen

我一直在向我的一个应用程序添加导航抽屉,我开始怀疑是否最好从使用
列表视图
切换到使用多个
文本视图
s作为导航抽屉列表项。查看,我注意到使用多个
TextView
s可能会更好看

目前,我正在导航抽屉中使用
列表视图
图像视图
(看起来有点像。但是,当我在导航抽屉中滚动时(由于列表中的项目还不够,我通过旋转设备横向视图来实现这一点),只有
列表视图
滚动,而
图像视图
保持原样。我希望它能够像这样滚动

此外,我发现我的导航抽屉中的
ListView
没有连锁反应,尽管我的其他
活动中的其他
ListView
s和
Fragment
s有连锁反应

我面临的问题是什么?我如何着手解决这些问题

更新: 在谷歌的I/O应用程序(2014)中,我认为底部似乎有一个
线性布局
,负责显示的项目列表。有人能解释一下这是如何工作的吗

只有ListView滚动,ImageView保持原样

听起来您的抽屉顶部有一个
ImageView
,然后是一个
ListView
。使用此配置,只有
ListView
会滚动(因为它是唯一可滚动的视图)

您需要将
ImageView
添加为始终位于列表开头的标题。根据建议的注释之一,执行
listView.addHeaderView

导航的底部似乎有一个线性布局 抽屉的布局,我认为是负责的项目清单 有人能解释一下这是怎么回事吗

它们使用
LinearLayout
作为容器来保存所有
TextView
s:

private void createNavDrawerItems() {
    mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list);
    ...
    int i = 0;
    for (int itemId : mNavDrawerItems) {
        mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer);
        mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]);
        ++i;
    }
}
我相信他们使用
线性布局
并以编程方式对所有项目进行充气的原因是能够轻松使用分隔项目:

private View makeNavDrawerItem(final int itemId, ViewGroup container) {
    ...
    if (itemId == NAVDRAWER_ITEM_SEPARATOR) {
        layoutToInflate = R.layout.navdrawer_separator;
    } else if (itemId == NAVDRAWER_ITEM_SEPARATOR_SPECIAL) {
        layoutToInflate = R.layout.navdrawer_separator;
    } else {
        layoutToInflate = R.layout.navdrawer_item;
    }
    ...
    return view;
}
列表视图中
您必须创建一个单独的项目类型,并在那里使用分隔符的布局,这可能会变得更麻烦

乍一看,然而,这段代码似乎是在重新发明轮子,因为所有这一切都可以通过
列表视图实现。截至2015年5月29日(在Google I/O 2015之后),您可以使用安卓设计支持库向您的应用程序添加一个。声明如下:

导航视图

可以是应用程序中标识和导航的重要焦点,此处设计的一致性可以显著提高应用程序的导航容易程度,特别是对于初次使用的用户。通过提供导航抽屉所需的框架以及为导航抽屉充气的能力,使导航变得更容易通过菜单资源查看项目

然后,您可以开始使用带有单个新依赖项的设计库:
编译'com.android.support:design:22.2.0'

设计库、AppCompat和所有Android支持库都是重要的工具,可以提供构建现代、美观的Android应用程序所需的构建块,而无需从头开始构建一切


使用android.support.v4.widget.DrawerLayout和NavigationView实现可滚动导航抽屉可能比下面介绍的更简单:

这篇文章建议将应用程序导航抽屉中的每个元素添加为菜单项。这对大多数开发人员来说都是一种很酷的方式。 但是,如果您已经在内部实现了导航抽屉(例如线性布局),该怎么办

看起来你可以很容易地让你以前的好的布局可以滚动:只需将它设置为NavigationView的“app:headerLayout”。不需要再做任何更改! 因此,在最终解决方案中,您将有:

您的活动布局,与上述博客文章类似,但没有“app:menu=“@menu/drawer”属性,例如:

<android.support.v4.widget.DrawerLayout
    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:fitsSystemWindows="true">

    <!-- your content layout -->

    <android.support.design.widget.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        />
</android.support.v4.widget.DrawerLayout>

这个提交,我迁移到了一个可滚动的导航抽屉:

请发布任何代码以获得更好的帮助。@SiloéBezerraBispo我真的认为没有必要发布这个场景的代码,但是如果你坚持,我应该在我的问题上添加什么代码?我认为使用文本视图(大概在滚动视图中)没有问题如果导航项是预先知道的,并且不是动态确定的,则可以使用ListView代替ListView。或者,您可以将图像作为标题视图添加到ListView.ListView.addHeaderView上。此库完全满足您的需要。我喜欢在您的答案中显示
TextView
s的想法,主要是因为我可以添加separators和对我的布局有更多的控制。您不需要添加单独的分隔符视图。LinearLayout可以在其子级之间绘制分隔符,只需给它一个可绘制的并调用“setShowDividers”(LinearLayout.SHOW_DIVIDER_MIDDLE);`谢谢你的回答。我会看看是否可以用这种方式在我的应用程序中实现导航抽屉。@Simas我在哪里可以找到你发布的代码(是从GitHub上的谷歌I/O应用程序中找到的)?@FarbodSalamat Zadeh是的,它来自您提供的链接所在的存储库。包含
createNavDrawerItems
方法。但是导航视图是否如问题中所述可滚动?我想必要时可以将其放置在
ScrollView
中。当我调用
DrawerLayout drawer=(DrawerLayout)在菜单项的一次单击中查找ViewById(R.id.drawer\U布局);drawer.closeDrawer(GravityCompat.START);
。未找到抽屉是错误的。
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    android:orientation="vertical">

    <TextView
        android:id="@+id/myFirstButton"
        android:onClick="onMyFirstButtonClick"
        android:text="@string/my_first_button_title"/>

    <TextView
        android:id="@+id/goToTheTopButton"
        android:onClick="onGoToTheTopButtonClick"
        android:text="@string/go_to_the_top_title"/>

    <View style="@style/Divider"/>

    <!-- Some other "menu items" -->
</LinearLayout>