创建抽屉式导航(navigation drawer)

    Navigation drawer是一个在屏幕左侧边缘显示导航选项的面板。大部分时候是隐藏的,当用户从屏幕左侧划屏,或在top level模式的app中点击action bar中的app图标时,才会显示。

    这节课叙述如何使用Support Library中的 API,来实现navigation drawer。

    Navigation Drawer 设计:在你决定在你的app中使用Navigation Drawer之前,你应该先理解在Navigation Drawer design guide中定义的使用情况和设计准则。

    要添加一个navigation drawer,在你的用户界面layout中声明一个用作root view(根视图)的对象。在DrawerLayout中为屏幕添加一个包含主要内容的view(当drawer隐藏时的主layout),和其他一些包含navigation drawer内容的view。

    例如,下面的layout使用了有两个子视图(child view)的:一个FrameLayout用来包含主要内容(在运行时被填入),和一个navigation drawer使用的ListView

    这个layout展示了一些layout的重要特点:

    • 主内容view(上面的),在DrawerLayout必须是第一个子视图,因为XML的顺序代表着Z轴(垂直于手机屏幕)的顺序,并且drawer必须在内容的前端。

    • 主内容view被设置为匹配父视图的宽和高,因为当navigation drawer隐藏时,主内容表示整个UI部分。

    • drawer视图以为单位指定它的宽和高来匹配父视图。drawer的宽度不能大于320dp,这样用户总能看到部分主内容。

    在你的activity中,首先要做的事就是要初始化drawer的item列表。这要根据你的app内容来处理,但是一个navigation drawer通常由一个组成,所以列表应该通过一个Adapter(例如或SimpleCursorAdapter)填入。

    例如,如何使用一个字符串数组()来初始化导航列表(navigation list):

    这段代码也调用了setOnItemClickListener()来接收navigation drawer列表的点击事件。下一节会说明如何实现这个接口,并且当用户选择一个item时如何改变内容视图(content view)。

    当用户选择drawer列表中的item,系统会调用在中所设置的OnItemClickListener的。

    onItemClick()方法中做什么,取决于你如何实现你的app结构()。在下面的例子中,每选择一个列表中的item,就插入一个不同的Fragment到主内容视图中(元素通过 ID辨识):

    要监听drawer的打开和关闭事件,在你的DrawerLayout中调用,并传入一个DrawerLayout.DrawerListener的实现。这个接口提供drawer事件的回调例如和onDrawerClosed()

    但是,如果你的activity包含有可以不用实现DrawerLayout.DrawerListener,你可以继承来替代。ActionBarDrawerToggle实现了,所以你仍然可以重写这些回调。这么做也能使action bar图标和 navigation drawer的交互操作变得更容易(在下节详述)。

    下一节会描述ActionBarDrawerToggle的构造参数,和处理与action bar图标交互所需的其他步骤。

    用户可以在屏幕左侧使用划屏手势来打开和关闭navigation drawer,但是如果你使用,你也应该允许用户通过点击app图标来打开或关闭。并且app图标也应该使用一个特殊的图标来指明navigation drawer的存在。你可以通过使用上一节所说的ActionBarDrawerToggle来实现所有的这些操作。

    要使起作用,通过它的构造函数创建一个实例,需要用到以下参数:

    • DrawerLayout

    • 一个drawable资源用作drawer指示器。
      标准的navigation drawer可以在获的

    • 一个字符串资源描述”打开抽屉”操作(便于访问)

    • 一个字符串资源描述”关闭抽屉”操作(便于访问)

    一个完整的navigation drawer例子,可以在原文页面顶端的sample下载