page.title=Creating a Navigation Drawer
page.tags="DrawerLayout", "navigation"

trainingnavtop=true

@jd:body

<div id="tb-wrapper">
<div id="tb">

<h2>This lesson teaches you to:</h2>
<ol>
  <li><a href="#DrawerLayout">Create a Drawer Layout</a></li>
  <li><a href="#Init">Initialize the Drawer List</a></li>
  <li><a href="#ListItemClicks">Handle Navigation Click Events</a></li>
  <li><a href="#OpenClose">Listen for Open and Close Events</a></li>
  <li><a href="#ActionBarIcon">Open and Close with the App Icon</a></li>
</ol>

<h2>Try it out</h2>

<div class="download-box">
<a href="http://developer.android.com/shareables/training/NavigationDrawer.zip"
  class="button">Download the sample app</a>
<p class="filename">NavigationDrawer.zip</p>
</div>

<div class="download-box">
<a href="http://developer.android.com/downloads/design/Android_Design_Icons_20130926.zip"
  class="button">Download the Action Bar Icon Pack</a>
<p class="filename">Android_Design_Icons_20130926.zip</p>
</div>

</div>
</div>



<p>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.</p>

<p>This lesson describes how to implement a navigation drawer using the
{@link android.support.v4.widget.DrawerLayout} APIs available in the
<a href="{@docRoot}tools/support-library/index.html">Support Library</a>.</p>

<div class="note design">
<p><strong>Navigation Drawer Design</strong></p>
<p>Before you decide to use a navigation drawer in your app, you should understand the use
cases and design principles defined in the
<a href="{@docRoot}design/patterns/navigation-drawer.html">Navigation Drawer</a> design guide.</p>
</div>


<h2 id="DrawerLayout">Create a Drawer Layout</h2>

<p>To add a navigation drawer, declare your user interface with a
{@link android.support.v4.widget.DrawerLayout} object as the root view of your layout.
Inside the {@link android.support.v4.widget.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.</p>

<p>For example, the following layout uses a {@link
android.support.v4.widget.DrawerLayout} with two child views: a {@link android.widget.FrameLayout}
to contain the main content (populated by a {@link android.app.Fragment} at
runtime), and a {@link android.widget.ListView} for the navigation drawer.</p>

<pre>
&lt;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">
    &lt;!-- The main content view -->
    &lt;FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    &lt;!-- The navigation drawer -->
    &lt;ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="&#64;android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
&lt;/android.support.v4.widget.DrawerLayout>
</pre>

<p>This layout demonstrates some important layout characteristics:</p>
<ul>
  <li>The main content view (the {@link android.widget.FrameLayout} above)
  <strong>must be the first child</strong> in the {@link
  android.support.v4.widget.DrawerLayout} because the XML order implies z-ordering
  and the drawer must be on top of the content.</li>
  <li>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.</li>
  <li>The drawer view (the {@link android.widget.ListView}) <strong>must specify its horizontal
  gravity</strong> with the {@code android:layout_gravity} attribute. To
  support right-to-left (RTL) languages, specify the value with {@code "start"}
  instead of {@code "left"} (so the drawer appears on the right when the layout is RTL).</p>
  </li>
  <li>The drawer view specifies its width in {@code 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.</li>
</ul>



<h2 id="Init">Initialize the Drawer List</h2>

<p>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 {@link android.widget.ListView}, so the list
should be populated by an {@link android.widget.Adapter} (such as {@link
android.widget.ArrayAdapter} or {@link android.widget.SimpleCursorAdapter}).</p>

<p>For example, here's how you can initialize the navigation list with a
<a href="{@docRoot}guide/topics/resources/string-resource.html#StringArray">string array</a>:</p>

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

    &#64;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&lt;String>(this,
                R.layout.drawer_list_item, mPlanetTitles));
        // Set the list's click listener
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        ...
    }
}
</pre>

<p>This code also calls {@link android.widget.ListView#setOnItemClickListener
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.</p>



<h2 id="ListItemClicks">Handle Navigation Click Events</h2>

<p>When the user selects an item in the drawer's list, the system calls {@link
android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} on the
{@link android.widget.AdapterView.OnItemClickListener OnItemClickListener} given to
{@link android.widget.ListView#setOnItemClickListener setOnItemClickListener()}.</p>

<p>What you do in the {@link
android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} method
depends on how you've implemented your <a
href="{@docRoot}design/patterns/app-structure.html">app structure</a>. In the following example,
selecting each item in the list inserts a different {@link
android.app.Fragment} into the main content view (the
{@link android.widget.FrameLayout} element identified by the {@code R.id.content_frame} ID):</p>

<pre>
private class DrawerItemClickListener implements ListView.OnItemClickListener {
    &#64;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);
}

&#64;Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

</pre>




<h2 id="OpenClose">Listen for Open and Close Events</h2>

<p>To listen for drawer open and close events, call {@link
android.support.v4.widget.DrawerLayout#setDrawerListener setDrawerListener()} on your
{@link android.support.v4.widget.DrawerLayout} and pass it an implementation of
{@link android.support.v4.widget.DrawerLayout.DrawerListener}. This interface provides callbacks
for drawer events such as {@link
android.support.v4.widget.DrawerLayout.DrawerListener#onDrawerOpened onDrawerOpened()} and {@link
android.support.v4.widget.DrawerLayout.DrawerListener#onDrawerClosed onDrawerClosed()}.</p>

<p>However, rather than implementing the {@link
android.support.v4.widget.DrawerLayout.DrawerListener}, if your activity includes the
<a href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>, you can instead
extend the {@link android.support.v4.app.ActionBarDrawerToggle} class. The
{@link android.support.v4.app.ActionBarDrawerToggle} implements
{@link android.support.v4.widget.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).</p>

<p>As discussed in the <a href="{@docRoot}design/patterns/navigation-drawer.html">Navigation
Drawer</a> 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 overriding {@link
android.support.v4.widget.DrawerLayout.DrawerListener} callback methods with an instance
of the {@link android.support.v4.app.ActionBarDrawerToggle} class:</p>

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

    &#64;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() */
    &#64;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);
    }
}
</pre>

<p>The next section describes the {@link android.support.v4.app.ActionBarDrawerToggle} constructor
arguments and the other steps required to set it up to handle interaction with the
action bar icon.</p>



<h2 id="ActionBarIcon">Open and Close with the App Icon</h2>

<p>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 <a
href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>, 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
{@link android.support.v4.app.ActionBarDrawerToggle} shown in the previous section.</p>

<p>To make {@link android.support.v4.app.ActionBarDrawerToggle} work, create an instance of
it with its constructor, which requires the following arguments:</p>
<ul>
  <li>The {@link android.app.Activity} hosting the drawer.
  <li>The {@link android.support.v4.widget.DrawerLayout}.
  <li>A drawable resource to use as the drawer indicator.
   <p>The standard navigation drawer icon is available in the <a href="http://developer.android.com/downloads/design/Android_Design_Icons_20130926.zip"
>Download the Action Bar Icon Pack</a>.</p>
  <li>A String resource to describe the "open drawer" action (for accessibility).
  <li>A String resource to describe the "close drawer" action (for accessibility).
</ul>

<p>Then, whether or not you've created a subclass of
{@link android.support.v4.app.ActionBarDrawerToggle} as your drawer listener, you need to call
upon your {@link android.support.v4.app.ActionBarDrawerToggle} in a few places throughout your
activity lifecycle:</p>

<pre>
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);
    }

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

    &#64;Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    &#64;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);
    }

    ...
}
</pre>

<p>For a complete example of a navigation drawer, download the sample available at the
<a href="#top">top of the page</a>.</p>
