Creating a Navigation Drawer 创建一个导航抽屉

The navigation drawer is a panel that displays the app’s main navigation options on the left edge of the screen. It is hidden most of the time, but is revealed when the user swipes a finger from the left edge of the screen or, while at the top level of the app, the user touches the app icon in the action bar.

//导航抽屉是一个显示在屏幕左边的应用的主要的用于导航的选项面板。它大多数时间是隐藏的,但是当用户从屏幕左边清扫或者点击了action bar上的应用图标时,导航抽屉将会出现

This lesson describes how to implement a navigation drawer using the DrawerLayout APIs available in the Support Library.

Navigation Drawer Design

Before you decide to use a navigation drawer in your app, you should understand the use cases and design principles defined in the Navigation Drawer design guide.

Create a Drawer Layout



To add a navigation drawer, declare your user interface with a DrawerLayout object as the root view of your layout. Inside the DrawerLayout, add one view that contains the main content for the screen (your primary layout when the drawer is hidden) and another view that contains the contents of the navigation drawer.

//想要添加drawerlayout,要在你的根布局上生命使用DrawerLayout对象,在DrawerLayout中添加一个主页面view和一个侧边栏view

For example, the following layout uses a DrawerLayout with two child views: a FrameLayout to contain the main content (populated by a Fragment at runtime), and a ListView for the navigation drawer.

<android.support.v4.widget.DrawerLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/drawer_layout"    android:layout_width="match_parent"    android:layout_height="match_parent">    <!-- The main content view -->    <FrameLayout        android:id="@+id/content_frame"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <!-- The navigation drawer -->    <ListView android:id="@+id/left_drawer"        android:layout_width="240dp"        android:layout_height="match_parent"        android:layout_gravity="start"        android:choiceMode="singleChoice"        android:divider="@android:color/transparent"        android:dividerHeight="0dp"        android:background="#111"/></android.support.v4.widget.DrawerLayout>

This layout demonstrates some important layout characteristics:

//这个布局说明了一些重要的布局特性:

  • The main content view (the FrameLayout above) must be the first child in the DrawerLayout because the XML order implies z-ordering and the drawer must be on top of the content. //主view必须是drawerlayout的第一个子view
  • The main content view is set to match the parent view‘s width and height, because it represents the entire UI when the navigation drawer is hidden. //主view 的宽高必须设置成match_parent的
  • The drawer view (the ListViewmust specify its horizontal gravity with the android:layout_gravity attribute. To support right-to-left (RTL) languages, specify the value with "start" instead of "left" (so the drawer appears on the right when the layout is RTL). //drawer view 必须指定 android:layout_gravity属性,为了支持RTL语言,指定属性值为start 而不是left,这样当布局是rtl时drawer就会出现在右侧
  • The drawer view specifies its width in dp units and the height matches the parent view. The drawer width should be no more than 320dp so the user can always see a portion of the main content.//drawer的宽必须不超过320dp,这样用户就总可以看得到主view

Initialize the Drawer List



In your activity, one of the first things to do is initialize the navigation drawer‘s list of items. How you do so depends on the content of your app, but a navigation drawer often consists of a ListView, so the list should be populated by an Adapter (such as ArrayAdapter or SimpleCursorAdapter).

For example, here‘s how you can initialize the navigation list with a string array:

public class MainActivity extends Activity {    private String[] mPlanetTitles;    private DrawerLayout mDrawerLayout;    private ListView mDrawerList;    ...

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);

        mPlanetTitles = getResources().getStringArray(R.array.planets_array);        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        // Set the adapter for the list view        mDrawerList.setAdapter(new ArrayAdapter<String>(this,                R.layout.drawer_list_item, mPlanetTitles));        // Set the list‘s click listener        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        ...    }}

This code also calls setOnItemClickListener() to receive click events in the navigation drawer‘s list. The next section shows how to implement this interface and change the content view when the user selects an item.

Handle Navigation Click Events



When the user selects an item in the drawer‘s list, the system calls onItemClick() on the OnItemClickListener given to setOnItemClickListener().

What you do in the onItemClick() method depends on how you‘ve implemented your app structure. In the following example, selecting each item in the list inserts a different Fragment into the main content view (the FrameLayout element identified by the R.id.content_frame ID):

private class DrawerItemClickListener implements ListView.OnItemClickListener {    @Override    public void onItemClick(AdapterView parent, View view, int position, long id) {        selectItem(position);    }}

/** Swaps fragments in the main content view */private void selectItem(int position) {    // Create a new fragment and specify the planet to show based on position    Fragment fragment = new PlanetFragment();    Bundle args = new Bundle();    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);    fragment.setArguments(args);

    // Insert the fragment by replacing any existing fragment    FragmentManager fragmentManager = getFragmentManager();    fragmentManager.beginTransaction()                   .replace(R.id.content_frame, fragment)                   .commit();

    // Highlight the selected item, update the title, and close the drawer    mDrawerList.setItemChecked(position, true);    setTitle(mPlanetTitles[position]);    mDrawerLayout.closeDrawer(mDrawerList);}

@Overridepublic void setTitle(CharSequence title) {    mTitle = title;    getActionBar().setTitle(mTitle);}

Listen for Open and Close Events



To listen for drawer open and close events, call setDrawerListener() on your DrawerLayout and pass it an implementation ofDrawerLayout.DrawerListener. This interface provides callbacks for drawer events such as onDrawerOpened() and onDrawerClosed().

However, rather than implementing the DrawerLayout.DrawerListener, if your activity includes the action bar, you can instead extend theActionBarDrawerToggle class. The ActionBarDrawerToggle implements DrawerLayout.DrawerListener so you can still override those callbacks, but it also facilitates the proper interaction behavior between the action bar icon and the navigation drawer (discussed further in the next section).

//为了监听侧边栏打开关闭,需要监听DrawerListener,如果你的activity包含action bar,你也可以使用ActionBarDrawerToggle类,这个类是DrawerListener的实现类

As discussed in the Navigation Drawer design guide, you should modify the contents of the action bar when the drawer is visible, such as to change the title and remove action items that are contextual to the main content. The following code shows how you can do so by overridingDrawerLayout.DrawerListener callback methods with an instance of the ActionBarDrawerToggle class:

public class MainActivity extends Activity {    private DrawerLayout mDrawerLayout;    private ActionBarDrawerToggle mDrawerToggle;    private CharSequence mDrawerTitle;    private CharSequence mTitle;    ...

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ...

        mTitle = mDrawerTitle = getTitle();        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */            public void onDrawerClosed(View view) {                super.onDrawerClosed(view);                getActionBar().setTitle(mTitle);                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()            }

            /** Called when a drawer has settled in a completely open state. */            public void onDrawerOpened(View drawerView) {                super.onDrawerOpened(drawerView);                getActionBar().setTitle(mDrawerTitle);                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()            }        };

        // Set the drawer toggle as the DrawerListener        mDrawerLayout.setDrawerListener(mDrawerToggle);    }

    /* Called whenever we call invalidateOptionsMenu() */    @Override    public boolean onPrepareOptionsMenu(Menu menu) {        // If the nav drawer is open, hide action items related to the content view        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);        menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);        return super.onPrepareOptionsMenu(menu);    }}

The next section describes the ActionBarDrawerToggle constructor arguments and the other steps required to set it up to handle interaction with the action bar icon.

Open and Close with the App Icon



Users can open and close the navigation drawer with a swipe gesture from or towards the left edge of the screen, but if you‘re using the action bar, you should also allow users to open and close it by touching the app icon. And the app icon should also indicate the presence of the navigation drawer with a special icon. You can implement all this behavior by using the ActionBarDrawerToggle shown in the previous section.

//如果你使用actionbar 你应该也允许用户通过点击app icon 来打开和关闭侧边栏,你可以实现这个行为通过使用ActionBarDrawerToggle

To make ActionBarDrawerToggle work, create an instance of it with its constructor, which requires the following arguments:

  • The Activity hosting the drawer.
  • The DrawerLayout.
  • A drawable resource to use as the drawer indicator.

    The standard navigation drawer icon is available in the Download the Action Bar Icon Pack.
  • A String resource to describe the "open drawer" action (for accessibility).
  • A String resource to describe the "close drawer" action (for accessibility).

Then, whether or not you‘ve created a subclass of ActionBarDrawerToggle as your drawer listener, you need to call upon your ActionBarDrawerTogglein a few places throughout your activity lifecycle:

public class MainActivity extends Activity {    private DrawerLayout mDrawerLayout;    private ActionBarDrawerToggle mDrawerToggle;    ...

    public void onCreate(Bundle savedInstanceState) {        ...

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);        mDrawerToggle = new ActionBarDrawerToggle(                this,                  /* host Activity */                mDrawerLayout,         /* DrawerLayout object */                R.drawable.ic_drawer,  /* nav drawer icon to replace ‘Up‘ caret */                R.string.drawer_open,  /* "open drawer" description */                R.string.drawer_close  /* "close drawer" description */                ) {

            /** Called when a drawer has settled in a completely closed state. */            public void onDrawerClosed(View view) {                super.onDrawerClosed(view);                getActionBar().setTitle(mTitle);            }

            /** Called when a drawer has settled in a completely open state. */            public void onDrawerOpened(View drawerView) {                super.onDrawerOpened(drawerView);                getActionBar().setTitle(mDrawerTitle);            }        };

        // Set the drawer toggle as the DrawerListener        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);        getActionBar().setHomeButtonEnabled(true);    }

    @Override    protected void onPostCreate(Bundle savedInstanceState) {        super.onPostCreate(savedInstanceState);        // Sync the toggle state after onRestoreInstanceState has occurred.        mDrawerToggle.syncState();    }

    @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        mDrawerToggle.onConfigurationChanged(newConfig);    }

    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Pass the event to ActionBarDrawerToggle, if it returns        // true, then it has handled the app icon touch event        if (mDrawerToggle.onOptionsItemSelected(item)) {          return true;        }        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);    }

    ...}

For a complete example of a navigation drawer, download the sample available at the top of the page.

时间: 2024-08-23 02:34:12

Creating a Navigation Drawer 创建一个导航抽屉的相关文章

AppDelegate 中didFinishLaunchingWithOptions方法创建一个导航view

ZBMainViewController *main=[[ZBMainViewController alloc] init]; ZBBaseController *navigationcontroller=[[ZBBaseController alloc] initWithRootViewController:main]; self.window.rootViewController=navigationcontroller;

Android组件——创建DrawerLayout导航

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42875231 概述 本篇博客是对developer.android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文! 关于DrawerLayout的Training:http://developer.android.com/training/implementing-navigation/nav-drawer.html 关于Dra

Navigation Drawer详解-Google推出的用来取代Sliding Menu的控件(一

相信Sliding Menu很多人都用过,在Android和iOS的app中,越来越多的开发者都会把自己的菜单界面放在一个列表里,然后让用户通过向右(或者向左)滑动的操作看到应用所有的功能.Google官方的应用也基本都选择了这种交互方式,不同的是,Google使用的是Navigation Drawer,而我们大部分用的还是Sliding Menu. 大家对Sliding Menu这个开源项目可能已经很熟悉了,但是Navigation Drawer我们有些童鞋可能了解的还比较少,它是Google

用CSS变形创建圆形导航

在这个教程中,我会教你使用CSS变形制作圆形导航. 我会带你一步步地创建样式,讲解背后的数学知识和简单的逻辑,让你对这技术有清晰的认识. 正如我提到的,使用CSS变形创建样式,会用到相关的基础数学知识.但是不必担心, 用到的数学非常简单,我会带你一步步地客克服它. 我要指出原技术属于Ana Tudor.我把它修改成我想要效果,这也是我希望你的在教程结束时去做的:对这技术有深入而且清晰的认识,开始查阅资料并且构建自己的样式. 结构 我们要创建一个导航,因此我们会从常见的导航结构开始.我们需要一个d

IOS开发——UI进阶篇(八)pickerView简单使用,通过storyboard加载控制器,注册界面,通过xib创建控制器,控制器的view创建,导航控制器的基本使用

一.pickerView简单使用 1.UIPickerViewDataSource 这两个方法必须实现 // 返回有多少列 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; // 返回第component有多少行 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

Android设计和开发系列第二篇:Navigation Drawer(Design)

Navigation Drawer Creating a Navigation Drawer The navigation drawer is a panel that transitions in from the left edge of the screen and displays the app’s main navigation options. Displaying the navigation drawer The user can bring the navigation dr

第三十二篇-NavigationView导航抽屉的使用

效果图: 导航抽屉所用到的布局是DrawerLayout,可以在里面添加一个线性布局和TextView组件,TextView组件的文本信息就是"主页面".然后和线性布局平行添加一个导航抽屉NavigationView 设置导航抽屉在左边,并且添加它的头部以及菜单 android:layout_gravity="left"app:headerLayout="@layout/head"app:menu="@menu/menu_main&qu

【原创+译文】官方文档中声明的如何创建抽屉导航栏(Navigation Drawer)

如需转载请注明出处:http://www.cnblogs.com/ghylzwsb/p/5831759.html 创建一个抽屉导航栏 抽屉式导航栏是显示在屏幕的左边缘,它是应用程序的主导航选项面板.它大部分时间是处于隐藏状态的,但是当用户从屏幕的左边缘挥动手指时它就会显示出来,而在应用程序的顶层,用户触摸操作栏上的应用程序图标也可以将其显示出来. 本课程介绍在可用的API 支持库下如何实现导航抽屉DrawerLayout. 首先我们可以看一下最终的效果图: 1.创建一个抽屉布局文件(Drawer

Android Navigation Drawer(导航抽屉)

Google I/O 2013 Android 更新了Support库,新版本的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建  Navigation Drawer模式.可以设置从左边划出菜单或者右边,也可以左右菜单同时存在. 添加 SlidingPaneLayout 控件来支持各种屏幕上的摘要.详情界面模式.比如 Gmail邮件列表和单个邮件详情界面.当在手机上显示的时候,邮件列表和详情界面分别为两个界面:当在平板上显示的时候,则为一个界面. 添