includes updates to App Nav and Action Bar pages Change-Id: I4ace9b37d3ade59e97d95b544cf380e5eb73665b
339 lines
15 KiB
Plaintext
339 lines
15 KiB
Plaintext
page.title=Navigation Drawer
|
||
page.tags="DrawerLayout","SlidingPaneLayout"
|
||
@jd:body
|
||
|
||
|
||
<a class="notice-developers" href="{@docRoot}training/implementing-navigation/nav-drawer.html">
|
||
<div>
|
||
<h3>Developer Docs</h3>
|
||
<p>Creating a Navigation Drawer</p>
|
||
</div>
|
||
</a>
|
||
|
||
|
||
<p>The navigation drawer is a panel that transitions in from the left edge of the screen and
|
||
displays the app’s main navigation options.</p>
|
||
|
||
|
||
<h4>Displaying the navigation drawer</h4>
|
||
|
||
<p>The user can bring the navigation drawer onto the screen by swiping from the left edge of the
|
||
screen or by touching the application icon on the action bar.</p>
|
||
|
||
<p>As the navigation drawer expands, it overlays the content but not the action bar. When the
|
||
drawer is fully extended, the action bar adjusts its content by replacing the current action
|
||
bar title with the app name and removing all actions that are contextual to the view underneath
|
||
the navigation drawer. The overflow menu with the standard action items for Settings and Help
|
||
remains visible.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_overview.png">
|
||
<div class="figure-caption">
|
||
The user can open the drawer panel by touching the navigation drawer indicator.
|
||
</div>
|
||
|
||
<p>Because they are transient, navigation drawers make views less cluttered. You can also use
|
||
them at deeper levels in the navigation hierarchy, allowing users to switch to your app's most
|
||
important screens from anywhere in the app.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_open_from_lower.png">
|
||
<div class="figure-caption">
|
||
Open the drawer from anywhere in your app by swiping from the left edge of the screen.
|
||
</div>
|
||
|
||
|
||
<h4>Dismissing the navigation drawer</h4>
|
||
|
||
<p> When the navigation drawer is expanded, the user can dismiss it in one of four ways: </p>
|
||
<ul>
|
||
<li>Touching the content outside the navigation drawer</li>
|
||
<li>Swiping to the left anywhere on the screen (including edge swipe from right)</li>
|
||
<li>Touching the app icon/title in the action bar</li>
|
||
<li>Pressing Back</li>
|
||
</ul>
|
||
|
||
|
||
<h2 id="WhenToUse"> When to Use the Navigation Drawer </h2>
|
||
|
||
<p> The navigation drawer is not a general replacement for top-level navigation via spinners
|
||
or tabs. The structure of your app should guide your choice of which pattern to use for
|
||
top-level switching. For more information on top-level switching mechanisms, see the
|
||
<a href="{@docRoot}design/patterns/app-structure.html">Application Structure</a> design pattern.</p>
|
||
<p> Here are some examples of where navigation drawers work best:</p>
|
||
|
||
<h4>More than 3 top-level views</h4>
|
||
<p> Navigation drawers are great for displaying a large number of navigation targets
|
||
concurrently. Use the navigation drawer if you have more than 3 unique top-level views.
|
||
If not, use fixed tabs for top-level organization to ease discovery and interaction.</p>
|
||
|
||
<h4>Cross-navigation from lower levels</h4>
|
||
<p> If your app requires cross-navigating between lower-level screens, consider using the
|
||
navigation drawer. Because it is accessible from anywhere in the app, the drawer enables
|
||
efficient navigation from lower-level screens to other important places in your app.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_cross_nav.png">
|
||
<div class="figure-caption">
|
||
The navigation drawer makes cross-navigation at lower levels possible.
|
||
</div>
|
||
|
||
|
||
<h4>Deep navigation branches</h4>
|
||
<p> If you have particularly deep branches, navigating to the top-level of your app can become
|
||
repetitive and cumbersome with Up and Back alone. Since navigation drawers are accessible from
|
||
anywhere in the app, navigation up to the top level is faster and more efficient.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_quick_to_top.png">
|
||
<div class="figure-caption">
|
||
The navigation drawer allows for quick jumps to the top-level of your app, removing the need
|
||
for repetitive Back or Up sequences.
|
||
</div>
|
||
|
||
|
||
<h2 id="Hubs">Navigation Hubs</h2>
|
||
|
||
<p>The navigation drawer is a reflection of your app’s structure and displays its major
|
||
navigation hubs. Think of navigation hubs as those places in your app that a user will want
|
||
to visit frequently or use as a jumping-off point to other parts of the app.
|
||
At a minimum, the navigation hubs are the top-level views, since they correspond to your app’s
|
||
major functional areas.</p>
|
||
<p> If your app’s structure is deep, you can add screens from lower levels that your users will
|
||
likely visit often and make those navigation hubs as well.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_navigation_hubs.png">
|
||
<div class="figure-caption">
|
||
The navigation drawer contains all of your app's navigation hubs. Include your top level
|
||
screens as well as important lower-level screens.
|
||
</div>
|
||
|
||
<div class="layout-content-row">
|
||
<div class="layout-content-col span-8">
|
||
<p> To facilitate access to the navigation drawer on navigation hubs, all screens that
|
||
correspond to an entry in your navigation drawer should show the navigation drawer indicator
|
||
next to the application icon in the action bar. Touching the app icon causes the navigation
|
||
drawer to slide in from the left. </p>
|
||
<p> All other lower-level screens show the traditional Up indicator next to the application
|
||
icon. The drawer is still accessible with an edge-swipe, but is not featured in the action bar.</p>
|
||
</div>
|
||
<div class="layout-content-col span-5">
|
||
<img src="{@docRoot}design/media/navigation_drawer_indicator_big.png">
|
||
<div class="figure-caption">
|
||
App icon with navigation drawer indicator.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<h2 id="Content">Content of the Navigation Drawer</h2>
|
||
|
||
<p> Keep the content of the navigation drawer focused on app navigation. Expose the navigation
|
||
hubs of your app as list items inside the navigation drawer - one item per row.
|
||
|
||
<div class="layout-content-row">
|
||
<div class="layout-content-col span-8">
|
||
<h4>Titles, icons, and counters</h4>
|
||
<p> You can structure navigation targets by adding titles. The titles are not interactive,
|
||
but just organize navigation targets into functional topics. If you have many navigation
|
||
targets, use titles to orient the user within the drawer.</p>
|
||
<p> Navigation targets can have optional leading icons as well as trailing counters. Use
|
||
the counters to inform users about a changed state of data in the corresponding view.</p>
|
||
</div>
|
||
<div class="layout-content-col span-5">
|
||
<img src="{@docRoot}design/media/navigation_drawer_titles_icons.png">
|
||
<div class="figure-caption">
|
||
Use titles and icons to organize your drawer.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="layout-content-row">
|
||
<div class="layout-content-col span-8">
|
||
<img src="{@docRoot}design/media/navigation_drawer_collapse.png">
|
||
<div class="figure-caption">
|
||
Collapsible navigation items are split. Use the left side for navigation and the right
|
||
to collapse and expand items.
|
||
</div>
|
||
</div>
|
||
<div class="layout-content-col span-5">
|
||
<h4>Collapsible navigation items</h4>
|
||
<p>If you have many views with some subordinate to others, consider collapsing them into one
|
||
expandable item to conserve space.
|
||
The parent in the navigation drawer then turns into a split item. The left side allows
|
||
navigation to the parent item’s view, and the right side collapses or expands the list of
|
||
child items. </p>
|
||
<p> At launch, the initial state of the collapsible items is up to you. As a rule, all
|
||
top-level view entries of the navigation drawer should be visible. If you have many collapsible
|
||
items, consider collapsing all items to allow the user to see the top-level views in their
|
||
entirety.</p>
|
||
<p> When the user opens the drawer from a lower-level screen, expand the associated branch
|
||
of the top-level view to give a stronger sense of place and highlight navigation opportunities
|
||
close to the user’s current
|
||
location in the app.</p>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<h2 id="ActionBar">Navigation Drawers and Action Bars</h2>
|
||
|
||
<p> When the user expands the navigation drawer, the task focus switches to selecting an item
|
||
from the drawer. Because the drawer does not overlay the action bar, users may not realize that
|
||
the items in the action bar do not pertain to the navigation drawer. </p>
|
||
<p> To reduce confusion, adjust the content of the action bar to the following, once the drawer
|
||
is fully expanded:</p>
|
||
<ul>
|
||
<li>App icon</li>
|
||
<li>App name</li>
|
||
<li>Remove actions from the action bar that are contextual to the underlying view (such as
|
||
Create new, Refresh). You may retain actions with global scope, such as “Search”.</li>
|
||
<li>Overflow menu with expected navigation targets, such as Settings and Help.</li>
|
||
</ul>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_open_overflow.png">
|
||
<div class="figure-caption">
|
||
Clean up the action bar when the drawer is fully expanded. Remove actions that are not needed
|
||
and display your app's name in the title area.
|
||
</div>
|
||
|
||
<h4>Actions</h4>
|
||
<div class="layout-content-row">
|
||
<div class="layout-content-col span-6">
|
||
<img src="{@docRoot}design/media/navigation_drawer_nav_and_actions.png">
|
||
<div class="figure-caption">
|
||
Keep actions on the right side of the action bar and in the overflow
|
||
</div>
|
||
</div>
|
||
<div class="layout-content-col span-6">
|
||
<p> Don’t place actions in the navigation drawer. Actions belong in the action bar, and the
|
||
user expects to see them there. Keep in mind that not all applications use the navigation
|
||
drawer pattern. It may be tempting to expose all your app’s capabilities in a single place,
|
||
but keep the bigger picture in mind. Place your actions where all apps display them.</p>
|
||
</div>
|
||
</div>
|
||
<div class="layout-content-row">
|
||
<div class="layout-content-col span-6">
|
||
<p> This also applies to common navigation targets, such as access to Help or the app’s
|
||
Settings. As per style guide convention Help and Settings are always located in the action
|
||
overflow.</p>
|
||
</div>
|
||
<div class="layout-content-col span-6">
|
||
<img src="{@docRoot}design/media/navigation_drawer_settings_help.png">
|
||
<div class="figure-caption">
|
||
Keep Help and Settings in the overflow.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<h4>Contextual action bars</h4>
|
||
<p> Sometimes the user will be in a state where a contextual action bar (CAB) appears instead
|
||
of the app’s action bar. This typically happens when the user selects text or selects multiple
|
||
items after a press-and-hold gesture. While the CAB is visible, you should still allow the
|
||
user to open the navigation drawer using an edge swipe. However, replace the CAB with the
|
||
standard action bar while the navigation drawer is open. When the user dismisses the drawer,
|
||
re-display the CAB.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_CAB.png">
|
||
<div class="figure-caption">
|
||
Hide contextual action bars while the drawer is visible.
|
||
</div>
|
||
|
||
<p>If the user navigates away from a view with selected content, deselect the content before
|
||
before navigating to the new view.</p>
|
||
|
||
|
||
<h2 id="Interaction">Interaction Details</h2>
|
||
|
||
<h4>Introduce the user to the drawer at first use</h4>
|
||
<p> Upon first launch of your app, introduce the user to the navigation drawer by
|
||
automatically opening it. This ensures that users know about the navigation drawer and prompts
|
||
them to learn about the structure of your app by exploring its content. Continue showing the
|
||
drawer upon subsequent launches until the user actively expands the navigation drawer manually.
|
||
Once you know that the user understands how to open the drawer, launch the app with the
|
||
navigation drawer closed. </p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_first_run.png">
|
||
<div class="figure-caption">
|
||
At first use, show the navigation drawer automatically to help the user learn the
|
||
functionality and structure of your app.
|
||
</div>
|
||
|
||
<h4>Give the user a quick peek</h4>
|
||
<p> If the user touches the very left edge of the screen (within 20 dp from the left), have the
|
||
drawer peek out as soon as the finger makes contact with the display. This promotes accidental
|
||
discovery and provides richer feedback. </p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_peek.png">
|
||
<div class="figure-caption">
|
||
The navigation drawer peeks out when the user touches the very left edge of the screen.
|
||
</div>
|
||
|
||
<h4>Highlights</h4>
|
||
<p> When you open the navigation drawer from a screen that is represented inside the drawer,
|
||
highlight its entry in the drawer. Vice versa, if you open the drawer from a screen that is
|
||
not listed in the drawer, none of the items of the drawer should be highlighted.</p>
|
||
|
||
|
||
<h2 id="ImpactOnNav">Impact of Drawer on Overall App Navigation</h2>
|
||
|
||
<p>The navigation drawer is an alternative to other top-level navigation patterns. To make apps
|
||
with navigation drawers work consistently with apps that use a tab or spinner pattern, remember
|
||
that all navigation requirements for system Back and Up apply.</p>
|
||
<p>Pay special attention to the following situations:</p>
|
||
|
||
<h4>System Back at the top level of the app</h4>
|
||
<p>Touching System Back at the app’s top level never opens the navigation drawer. Instead,
|
||
System Back behaves according to the navigation rules for the top level, such as navigating
|
||
to the previous app within the task or navigating to the Home screen.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_top_out.png">
|
||
<div class="figure-caption">
|
||
System Back does not show the drawer, but behaves according to the navigation rules for
|
||
the top level.
|
||
</div>
|
||
|
||
<h4>System Back after cross navigation to lower hierarchy levels</h4>
|
||
<p>If the user navigates to a lower hierarchy screen from the navigation drawer and the screen
|
||
has a direct parent, then the Back stack is reset and Back points to the target screen’s parent.
|
||
This Back behavior is the same as when a user navigates into an app from a notification.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_reset_backstack.png">
|
||
<div class="figure-caption">
|
||
Reset the Back stack if your lower-level navigation target has direct parents.
|
||
</div>
|
||
|
||
|
||
<h2 id="Style">Style</h2>
|
||
|
||
<p>The width of the navigation drawer depends on the content you want to display, but should be
|
||
between a minimum of 240 dp and a maximum of 320 dp. The height of the individual line items
|
||
should not fall below 48 dp. See the layout guideline below for recommendations on padding and
|
||
spacing.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_layout.png">
|
||
<div class="figure-caption">
|
||
Layout guidelines for the navigation drawer.
|
||
</div>
|
||
|
||
|
||
<p>Pick the drawer background to best match your app’s theme. See the following examples
|
||
for a Holo light and a Holo dark themed drawer.</p>
|
||
|
||
<img src="{@docRoot}design/media/navigation_drawer_holo_dark_light.png">
|
||
<div class="figure-caption">
|
||
Navigation drawers in Holo light and Holo dark themed apps.
|
||
</div>
|
||
|
||
|
||
<h2 id="Checklist">Navigation Drawer Checklist</h2>
|
||
|
||
<p>Even if you already support a similar navigation drawer, update your drawer to this
|
||
pattern to make sure that:</p>
|
||
<ul>
|
||
<li>The action bar remains in place and adjusts its content.</li>
|
||
<li>Your navigation drawer overlays the content.</li>
|
||
<li>Any view represented in the drawer has a navigation drawer indicator in its action bar
|
||
that allows the drawer to be opened by touching the app icon.</li>
|
||
<li>You take advantage of the new visual drawer transition.</li>
|
||
<li>Any view not represented in the drawer maintains the traditional Up indicator in its action bar.</li>
|
||
<li>You stay in sync with the general navigation patterns for Up and Back.</li>
|
||
</ul>
|
||
|