From 5e0959393426371dadef2c7905d5c915a1ac2dd4 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Fri, 16 Dec 2011 13:06:22 -0800 Subject: [PATCH] docs: update menu guide with CAB and popup menu, plus many other revisions Change-Id: I5faedd5f5b812ca58eb2085b0c036570de861f15 --- core/java/android/view/ActionMode.java | 12 +- docs/html/guide/guide_toc.cs | 2 +- docs/html/guide/topics/ui/actionbar.jd | 14 +- docs/html/guide/topics/ui/menus.jd | 1166 +++++++++++++++--------- docs/html/images/ui/menu-context.png | Bin 0 -> 45304 bytes docs/html/images/ui/popupmenu.png | Bin 0 -> 8186 bytes 6 files changed, 778 insertions(+), 416 deletions(-) create mode 100644 docs/html/images/ui/menu-context.png create mode 100644 docs/html/images/ui/popupmenu.png diff --git a/core/java/android/view/ActionMode.java b/core/java/android/view/ActionMode.java index 34e7d4d746bbb..0349a2be3fbff 100644 --- a/core/java/android/view/ActionMode.java +++ b/core/java/android/view/ActionMode.java @@ -18,9 +18,15 @@ package android.view; /** - * Represents a contextual mode of the user interface. Action modes can be used for - * modal interactions with content and replace parts of the normal UI until finished. - * Examples of good action modes include selection modes, search, content editing, etc. + * Represents a contextual mode of the user interface. Action modes can be used to provide + * alternative interaction modes and replace parts of the normal UI until finished. + * Examples of good action modes include text selection and contextual actions. + *
+ *

Developer Guides

+ *

For information about how to provide contextual actions with {@code ActionMode}, + * read the Menus + * developer guide.

+ *
*/ public abstract class ActionMode { private Object mTag; diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 6c01d44edfce4..4a9a6848632a8 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -131,7 +131,7 @@
  • Menus -
  • + updated
  • Action Bar
  • diff --git a/docs/html/guide/topics/ui/actionbar.jd b/docs/html/guide/topics/ui/actionbar.jd index b83bde75dd2a3..b35bc5f3cbee5 100644 --- a/docs/html/guide/topics/ui/actionbar.jd +++ b/docs/html/guide/topics/ui/actionbar.jd @@ -113,9 +113,10 @@ accessible to the user in a predictable way. href="{@docRoot}guide/topics/ui/menus.html#OptionsMenu">options menu directly in the action bar, as "action items." Action items can also provide an "action view," which provides an embedded widget for even more immediate action behaviors. Menu items that are not promoted -to an action item are available in the overflow menu, revealed by either the device MENU button +to an action item are available in the overflow menu, revealed by either the device Menu +button (when available) or by an "overflow menu" button in the action bar (when the device does not -include a MENU button).

    +include a Menu button).

    @@ -125,6 +126,10 @@ href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery landscape handset), showing the logo on the left, navigation tabs, and an action item on the right (plus the overflow menu button).

    +

    Note: If you're looking for information about the contextual +action bar for displaying contextual action items, see the Menu guide.

    +

    Action Bar Design

    @@ -225,9 +230,10 @@ later—calling {@link android.app.Activity#getActionBar()} will return null href="{@docRoot}guide/topics/ui/menus.html#OptionsMenu">options menu. To do this, you can declare that the menu item should appear in the action bar as an "action item." An action item can include an icon and/or a text title. If a menu item does not appear as an action item, then the -system places it in the overflow menu. The overflow menu is revealed either by the device MENU +system places it in the overflow menu. The overflow menu is revealed either by the device +Menu button (if provided by the device) or an additional button in the action bar (if the device does not -provide the MENU button).

    +provide the Menu button).

    diff --git a/docs/html/guide/topics/ui/menus.jd b/docs/html/guide/topics/ui/menus.jd index 7b5b3dc2f3c18..a2313b368b821 100644 --- a/docs/html/guide/topics/ui/menus.jd +++ b/docs/html/guide/topics/ui/menus.jd @@ -6,77 +6,129 @@ parent.link=index.html -

    Menus are an important part of an activity's user interface, which provide users a familiar -way to perform actions. Android offers a simple framework for you to add standard -menus to your application.

    +

    Menus are a common user interface component in many types of applications. To provide a familiar +and consistent user experience, you should use the {@link android.view.Menu} APIs to present user +actions and other options in your activities.

    + +

    Beginning with Android 3.0 (API level 11), Android-powered devices are no longer required to +provide a dedicated Menu button. With this change, Android apps should migrate away from a +dependence on the traditional 6-item menu panel and instead provide an action bar to present common +user actions.

    + +

    Although the design and user experience for some menu items have changed, the semantics to define +a set of actions and options is still based on the {@link android.view.Menu} APIs. This +guide shows how to create the three fundamental types of menus or action presentations on all +versions of Android:

    -

    There are three types of application menus:

    -
    Options Menu
    -
    The primary collection of menu items for an activity, which appears when the user touches -the MENU button. When your application is running on Android 3.0 or later, you can provide -quick access to select menu items by placing them directly in the Action Bar, as "action items."
    -
    Context Menu
    -
    A floating list of menu items that appears when the user touches and holds a view -that's registered to provide a context menu. +
    Options menu and action bar
    +
    The options menu is the primary collection of menu items for an +activity. It's where you should place actions that have a global impact on the app, such as +"Search," "Compose email," and "Settings." +

    If you're developing for Android 2.3 or lower, users can +reveal the options menu panel by pressing the Menu button.

    +

    On Android 3.0 and higher, items from the options menu are presented by the action bar as a combination of on-screen action +items and overflow options. Beginning with Android 3.0, the Menu button is deprecated (some +devices +don't have one), so you should migrate toward using the action bar to provide access to actions and +other options.

    +

    See the section about Creating an Options Menu.

    +
    + +
    Context menu and contextual action mode
    + +
    A context menu is a floating menu that appears when the +user performs a long-click on an element. It provides actions that affect the selected content or +context frame. +

    When developing for Android 3.0 and higher, you should instead use the contextual action mode to enable actions on selected content. This mode displays +action items that affect the selected content in a bar at the top of the screen and allows the user +to select multiple items.

    +

    See the section about Creating Contextual Menus.

    +
    + +
    Popup menu
    +
    A popup menu displays a list of items in a vertical list that's anchored to the view that +invoked the menu. It's good for providing an overflow of actions that relate to specific content or +to provide options for a second part of a command. Actions in a popup menu should +not directly affect the corresponding content—that's what contextual actions +are for. Rather, the popup menu is for extended actions that relate to regions of content in your +activity. +

    See the section about Creating a Popup Menu.

    -
    Submenu
    -
    A floating list of menu items that appears when the user touches a menu item that contains -a nested menu.
    -

    This document shows you how to create each type of menu, using XML to define the content of -the menu and callback methods in your activity to respond when the user selects an item.

    +

    Defining a Menu in XML

    -

    Creating a Menu Resource

    +

    For all menu types, Android provides a standard XML format to define menu items. +Instead of building a menu in your activity's code, you should define a menu and all its items in an +XML menu resource. You can then +inflate the menu resource (load it as a {@link android.view.Menu} object) in your activity or +fragment.

    -

    Instead of instantiating a {@link android.view.Menu} in your application code, you should -define a menu and all its items in an XML menu resource, then inflate the menu -resource (load it as a programmable object) in your application code. Using a menu resource to -define your menu is a good practice because it separates the content for the menu from your -application code. It's also easier to visualize the structure and content of a menu in XML.

    +

    Using a menu resource is a good practice for a few reasons:

    +
      +
    • It's easier to visualize the menu structure in XML.
    • +
    • It separates the content for the menu from your application's behavioral code.
    • +
    • It allows you to create alternative menu configurations for different platform versions, +screen sizes, and other configurations by leveraging the app resources framework.
    • +
    -

    To create a menu resource, create an XML file inside your project's res/menu/ +

    To define the menu, create an XML file inside your project's res/menu/ directory and build the menu with the following elements:

    <menu>
    @@ -90,8 +142,8 @@ element may contain a nested <menu> element in order to create a
    <group>
    An optional, invisible container for {@code <item>} elements. It allows you to -categorize menu items so they share properties such as active state and visibility. See the -section about Menu groups.
    +categorize menu items so they share properties such as active state and visibility. For more +information, see the section about Creating Menu Groups.
    @@ -101,14 +153,17 @@ section about Menu groups. <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" - android:title="@string/new_game" /> + android:title="@string/new_game" + android:showAsAction="ifRoom"/> <item android:id="@+id/help" android:icon="@drawable/ic_help" android:title="@string/help" /> </menu> -

    This example defines a menu with two items. Each item includes the attributes:

    +

    The <item> element supports several attributes you can use to define an item's +appearance and behavior. The items in the above menu include the following attributes:

    +
    {@code android:id}
    A resource ID that's unique to the item, which allows the application can recognize the item @@ -117,312 +172,24 @@ when the user selects it.
    A reference to a drawable to use as the item's icon.
    {@code android:title}
    A reference to a string to use as the item's title.
    +
    {@code android:showAsAction}
    +
    Specifies when and how this item should appear as an action item in the action bar.
    -

    There are many more attributes you can include in an {@code <item>}, including some that - specify how the item may appear in the Action Bar. For more information about the XML -syntax and attributes for a menu resource, see the Menu Resource reference.

    +

    These are the most important attributes you should use, but there are many more available. +For information about all the supported attributes, see the Menu Resource document.

    - - -

    Inflating a Menu Resource

    - -

    From your application code, you can inflate a menu resource (convert the XML resource into a -programmable object) using -{@link android.view.MenuInflater#inflate(int,Menu) MenuInflater.inflate()}. For -example, the following code inflates the game_menu.xml file defined above, during the -{@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} callback method, to -use the menu as the activity's Options Menu:

    - -
    -@Override
    -public boolean onCreateOptionsMenu(Menu menu) {
    -    MenuInflater inflater = getMenuInflater();
    -    inflater.inflate(R.menu.game_menu, menu);
    -    return true;
    -}
    -
    - -

    The {@link android.app.Activity#getMenuInflater()} method returns a {@link -android.view.MenuInflater} for the activity. With this object, you can call {@link -android.view.MenuInflater#inflate(int,Menu) inflate()}, which inflates a menu resource into a -{@link android.view.Menu} object. In this example, the menu resource defined by -game_menu.xml -is inflated into the {@link android.view.Menu} that was passed into {@link -android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}. (This callback method for -the Options Menu is discussed more in the next section.)

    - - - -

    Creating an Options Menu

    - -
    - -

    Figure 1. Screenshot of the Options Menu in the -Browser.

    -
    - -

    The Options Menu is where you should include basic activity actions and necessary navigation -items (for example, a button to open the application settings). Items in the Options Menu are -accessible in two distinct ways: the MENU button or in the Action Bar (on devices running Android 3.0 -or higher).

    - -

    When running on a device with Android 2.3 and lower, the Options Menu appears at the bottom of -the screen, as shown in figure 1. When opened, the first visible portion of the Options Menu is -the icon menu. It holds the first six menu items. If you add more than six items to the -Options Menu, Android places the sixth item and those after it into the overflow menu, which the -user can open by touching the "More" menu item.

    - -

    On Android 3.0 and higher, items from the Options Menu is placed in the Action Bar, which appears -at the top of the activity in place of the traditional title bar. By default all items from the -Options Menu are placed in the overflow menu, which the user can open by touching the menu icon -on the right side of the Action Bar. However, you can place select menu items directly in the -Action Bar as "action items," for instant access, as shown in figure 2.

    - -

    When the Android system creates the Options Menu for the first time, it calls your -activity's {@link android.app.Activity#onCreateOptionsMenu(Menu) -onCreateOptionsMenu()} method. Override this method in your activity -and populate the {@link android.view.Menu} that is passed into the method, -{@link android.view.Menu} by inflating a menu resource as described above in Inflating a Menu Resource. For example:

    - -
    -@Override
    -public boolean onCreateOptionsMenu(Menu menu) {
    -    MenuInflater inflater = getMenuInflater();
    -    inflater.inflate(R.menu.game_menu, menu);
    -    return true;
    -}
    -
    - -
    - -

    Figure 2. Action bar from the Honeycomb Gallery app, including -navigation tabs and a camera action item (plus the overflow menu button).

    -
    - -

    You can also populate the menu in code, using {@link android.view.Menu#add(int,int,int,int) -add()} to add items to the {@link android.view.Menu}.

    - -

    Note: On Android 2.3 and lower, the system calls {@link -android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} to create the Options Menu -when the user opens it for the first time, but on Android 3.0 and greater, the system creates it as -soon as the activity is created, in order to populate the Action Bar.

    - - -

    Responding to user action

    - -

    When the user selects a menu item from the Options Menu (including action items in the -Action Bar), the system calls your activity's -{@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} -method. This method passes the -{@link android.view.MenuItem} that the user selected. You can identify the menu item by calling -{@link android.view.MenuItem#getItemId()}, which returns the unique ID for the menu -item (defined by the {@code android:id} attribute in the menu resource or with an integer -given to the {@link android.view.Menu#add(int,int,int,int) add()} method). You can match this ID -against known menu items and perform the appropriate action. For example:

    - -
    -@Override
    -public boolean onOptionsItemSelected(MenuItem item) {
    -    // Handle item selection
    -    switch (item.getItemId()) {
    -    case R.id.new_game:
    -        newGame();
    -        return true;
    -    case R.id.help:
    -        showHelp();
    -        return true;
    -    default:
    -        return super.onOptionsItemSelected(item);
    -    }
    -}
    -
    - -

    In this example, {@link android.view.MenuItem#getItemId()} queries the ID for the selected menu -item and the switch statement compares the ID against the resource IDs that were assigned to menu -items in the XML resource. When a switch case successfully handles the menu item, it -returns {@code true} to indicate that the item selection was handled. Otherwise, the default -statement passes the menu item to the super class, in -case it can handle the item selected. (If you've directly extended the {@link android.app.Activity} -class, then the super class returns {@code false}, but it's a good practice to -pass unhandled menu items to the super class instead of directly returning {@code false}.)

    - -

    Additionally, Android 3.0 adds the ability for you to define the on-click behavior for a menu -item in the menu resource XML, -using the {@code android:onClick} attribute. So you don't need to implement {@link -android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}. Using the {@code -android:onClick} attribute, you can specify a method to call when the user selects the menu item. -Your activity must then implement the method specified in the {@code android:onClick} attribute so -that it accepts a single {@link android.view.MenuItem} parameter—when the system calls this -method, it passes the menu item selected.

    - -

    Tip: If your application contains multiple activities and -some of them provide the same Options Menu, consider creating -an activity that implements nothing except the {@link android.app.Activity#onCreateOptionsMenu(Menu) -onCreateOptionsMenu()} and {@link android.app.Activity#onOptionsItemSelected(MenuItem) -onOptionsItemSelected()} methods. Then extend this class for each activity that should share the -same Options Menu. This way, you have to manage only one set of code for handling menu -actions and each descendant class inherits the menu behaviors.

    -If you want to add menu items to one of your descendant activities, -override {@link android.app.Activity#onCreateOptionsMenu(Menu) -onCreateOptionsMenu()} in that activity. Call {@code super.onCreateOptionsMenu(menu)} so the -original menu items are created, then add new menu items with {@link -android.view.Menu#add(int,int,int,int) menu.add()}. You can also override the super class's -behavior for individual menu items.

    - - -

    Changing menu items at runtime

    - -

    Once the activity is created, the {@link android.app.Activity#onCreateOptionsMenu(Menu) -onCreateOptionsMenu()} method is -called only once, as described above. The system keeps and re-uses the {@link -android.view.Menu} you define in this method until your activity is destroyed. If you want to change -the Options Menu any time after it's first created, you must override the -{@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()} method. This passes -you the {@link android.view.Menu} object as it currently exists. This is useful if you'd like to -remove, add, disable, or enable menu items depending on the current state of your application.

    - -

    On Android 2.3 and lower, the system calls {@link android.app.Activity#onPrepareOptionsMenu(Menu) -onPrepareOptionsMenu()} each time the user opens the Options Menu.

    - -

    On Android 3.0 and higher, you must call {@link android.app.Activity#invalidateOptionsMenu -invalidateOptionsMenu()} when you want to update the menu, because the menu is always open. The -system will then call {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()} -so you can update the menu items.

    - -

    Note: -You should never change items in the Options Menu based on the {@link android.view.View} currently -in focus. When in touch mode (when the user is not using a trackball or d-pad), views -cannot take focus, so you should never use focus as the basis for modifying -items in the Options Menu. If you want to provide menu items that are context-sensitive to a {@link -android.view.View}, use a Context Menu.

    - -

    If you're developing for Android 3.0 or higher, be sure to also read the Action Bar developer guide.

    - - - - -

    Creating a Context Menu

    - -

    A context menu is conceptually similar to the menu displayed when the user performs a -"right-click" on a PC. You should use a context menu to provide the user access to -actions that pertain to a specific item in the user interface. On Android, a context menu is -displayed when the user performs a "long press" (press and hold) on an item.

    - -

    You can create a context menu for any View, though context menus are most often used for items in -a {@link android.widget.ListView}. When the user performs a long-press on an item in a ListView and -the list is registered to provide a context menu, the list item signals to the user that a context -menu is available by animating its background color—it transitions from -orange to white before opening the context menu. (The Contacts application demonstrates this -feature.)

    - - - -

    In order for a View to provide a context menu, you must "register" the view for a context -menu. Call {@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()} and -pass it the {@link android.view.View} you want to give a context menu. When this View then -receives a long-press, it displays a context menu.

    - -

    To define the context menu's appearance and behavior, override your activity's context menu -callback methods, {@link android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo) -onCreateContextMenu()} and -{@link android.app.Activity#onContextItemSelected(MenuItem) onContextItemSelected()}.

    - -

    For example, here's an {@link -android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo) -onCreateContextMenu()} that uses the {@code context_menu.xml} menu resource:

    -
    -@Override
    -public void onCreateContextMenu(ContextMenu menu, View v,
    -                                ContextMenuInfo menuInfo) {
    -  super.onCreateContextMenu(menu, v, menuInfo);
    -  MenuInflater inflater = getMenuInflater();
    -  inflater.inflate(R.menu.context_menu, menu);
    -}
    -
    - -

    {@link android.view.MenuInflater} is used to inflate the context menu from a menu resource. (You can also use -{@link android.view.Menu#add(int,int,int,int) add()} to add menu items.) The callback method -parameters include the {@link android.view.View} -that the user selected and a {@link android.view.ContextMenu.ContextMenuInfo} object that provides -additional information about the item selected. You might use these parameters to determine -which context menu should be created, but in this example, all context menus for the activity are -the same.

    - -

    Then when the user selects an item from the context menu, the system calls {@link -android.app.Activity#onContextItemSelected(MenuItem) onContextItemSelected()}. Here is an example -of how you can handle selected items:

    - -
    -@Override
    -public boolean onContextItemSelected(MenuItem item) {
    -  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    -  switch (item.getItemId()) {
    -  case R.id.edit:
    -    editNote(info.id);
    -    return true;
    -  case R.id.delete:
    -    deleteNote(info.id);
    -    return true;
    -  default:
    -    return super.onContextItemSelected(item);
    -  }
    -}
    -
    - -

    The structure of this code is similar to the example for Creating an -Options Menu, in which {@link android.view.MenuItem#getItemId()} queries the ID for the selected -menu item and a switch statement matches the item to the IDs that are defined in the menu resource. -And like the options menu example, the default statement calls the super class in case it -can handle menu items not handled here, if necessary.

    - -

    In this example, the selected item is an item from a {@link android.widget.ListView}. To -perform an action on the selected item, the application needs to know the list -ID for the selected item (it's position in the ListView). To get the ID, the application calls -{@link android.view.MenuItem#getMenuInfo()}, which returns a {@link -android.widget.AdapterView.AdapterContextMenuInfo} object that includes the list ID for the -selected item in the {@link android.widget.AdapterView.AdapterContextMenuInfo#id id} field. The -local methods editNote() and deleteNote() methods accept this list ID to -perform an action on the data specified by the list ID.

    - -

    Note: Items in a context menu do not support icons or shortcut -keys.

    - - - - - -

    A submenu is a menu that the user can open by selecting an item in another menu. You can add a -submenu to any menu (except a submenu). Submenus are useful when your application has a lot of -functions that can be organized into topics, like items in a PC application's menu bar (File, Edit, -View, etc.).

    - -

    When creating your menu -resource, you can create a submenu by adding a {@code <menu>} element as the child of an -{@code <item>}. For example:

    +

    You can add a submenu to an item in any menu (except a submenu) by adding a {@code <menu>} +element as the child of an {@code <item>}. Submenus are useful when your application has a lot +of functions that can be organized into topics, like items in a PC application's menu bar (File, +Edit, View, etc.). For example:

     <?xml version="1.0" encoding="utf-8"?>
     <menu xmlns:android="http://schemas.android.com/apk/res/android">
         <item android:id="@+id/file"
    -          android:icon="@drawable/file"
               android:title="@string/file" >
             <!-- "file" submenu -->
             <menu>
    @@ -435,23 +202,625 @@ resource, you can create a submenu by adding a {@code <menu>} element
     </menu>
     
    -

    When the user selects an item from a submenu, the parent menu's respective on-item-selected -callback method receives the event. For instance, if the above menu is applied as an Options Menu, -then the {@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} method -is called when a submenu item is selected.

    - -

    You can also use {@link android.view.Menu#addSubMenu(int,int,int,int) addSubMenu()} to -dynamically add a {@link android.view.SubMenu} to an existing {@link android.view.Menu}. This -returns the new {@link android.view.SubMenu} object, to which you can add -submenu items, using {@link android.view.Menu#add(int,int,int,int) add()}

    +

    To use the menu in your activity, you need to inflate the menu resource (convert the XML +resource into a programmable object) using {@link android.view.MenuInflater#inflate(int,Menu) +MenuInflater.inflate()}. In the following sections, you'll see how to inflate a menu for each +menu type.

    -

    Other Menu Features

    +

    Creating an Options Menu

    -

    Here are some other features that you can apply to most menu items.

    +
    + +

    Figure 1. Options menu in the +Browser, on Android 2.3.

    +
    -

    Menu groups

    +

    The options menu is where you should include actions and other options that are relevant to the +current activity context, such as "Search," "Compose email," and "Settings."

    + +

    Where the items in your options menu appear on the screen depends on the version for which you've +developed your application:

    + +
      +
    • If you've developed your application for Android 2.3.x (API level 10) or +lower, the contents of your options menu appear at the bottom of the screen when the user +presses the Menu button, as shown in figure 1. When opened, the first visible portion is +the icon +menu, which holds up to six menu items. If your menu includes more than six items, Android places +the sixth item and the rest into the overflow menu, which the user can open by selecting +More.
    • + +
    • If you've developed your application for Android 3.0 (API level 11) and +higher, items from the options menu are available in the action bar. By default, the system +places all items in the action overflow, which the user can reveal with the action overflow icon on +the right side of the action bar (or by pressing the device Menu button, if available). To +enable +quick access to important actions, you can promote a few items to appear in the action bar by adding +{@code android:showAsAction="ifRoom"} to the corresponding {@code <item>} elements (see figure +2).

      For more information about action items and other action bar behaviors, see the Action Bar guide.

      +

      Note: Even if you're not developing for Android 3.0 or +higher, you can build your own action bar layout for a similar effect. For an example of how you can +support older versions of Android with an action bar, see the Action Bar Compatibility +sample.

      +
    • +
    + + +

    Figure 2. Action bar from the Honeycomb Gallery app, showing +navigation tabs and a camera action item (plus the action overflow button).

    + +

    You can declare items for the options menu from either your {@link android.app.Activity} +subclass or a {@link android.app.Fragment} subclass. If both your activity and fragment(s) +declare items for the options menu, they are combined in the UI. The activity's items appear +first, followed by those of each fragment in the order in which each fragment is added to the +activity. If necessary, you can re-order the menu items with the {@code android:orderInCategory} +attribute in each {@code <item>} you need to move.

    + +

    To specify the options menu for an activity, override {@link +android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} (fragments provide their +own {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()} callback). In this +method, you can inflate your menu resource (defined in XML) into the {@link +android.view.Menu} provided in the callback. For example:

    + +
    +@Override
    +public boolean onCreateOptionsMenu(Menu menu) {
    +    MenuInflater inflater = {@link android.app.Activity#getMenuInflater()};
    +    inflater.inflate(R.menu.game_menu, menu);
    +    return true;
    +}
    +
    + +

    You can also add menu items using {@link android.view.Menu#add(int,int,int,int) +add()} and retrieve items with {@link android.view.Menu#findItem findItem()} to revise their +properties with {@link android.view.MenuItem} APIs.

    + +

    If you've developed your application for Android 2.3.x and lower, the system calls {@link +android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} to create the options menu +when the user opens the menu for the first time. If you've developed for Android 3.0 and higher, the +system calls {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} when +starting the activity, in order to show items to the action bar.

    + + + +

    Handling click events

    + +

    When the user selects an item from the options menu (including action items in the action bar), +the system calls your activity's {@link android.app.Activity#onOptionsItemSelected(MenuItem) +onOptionsItemSelected()} method. This method passes the {@link android.view.MenuItem} selected. You +can identify the item by calling {@link android.view.MenuItem#getItemId()}, which returns the unique +ID for the menu item (defined by the {@code android:id} attribute in the menu resource or with an +integer given to the {@link android.view.Menu#add(int,int,int,int) add()} method). You can match +this ID against known menu items to perform the appropriate action. For example:

    + +
    +@Override
    +public boolean onOptionsItemSelected(MenuItem item) {
    +    // Handle item selection
    +    switch (item.getItemId()) {
    +        case R.id.new_game:
    +            newGame();
    +            return true;
    +        case R.id.help:
    +            showHelp();
    +            return true;
    +        default:
    +            return super.onOptionsItemSelected(item);
    +    }
    +}
    +
    + +

    When you successfully handle a menu item, return {@code true}. If you don't handle the menu +item, you should call the superclass implementation of {@link +android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} (the default +implementation returns false).

    + +

    If your activity includes fragments, the system first calls {@link +android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} for the activity then +for each fragment (in the order each fragment was added) until one returns +{@code true} or all fragments have been called.

    + +

    Tip: Android 3.0 adds the ability for you to define the on-click +behavior for a menu item in XML, using the {@code android:onClick} attribute. The value for the +attribute must be the name of a method defined by the activity using the menu. The method +must be public and accept a single {@link android.view.MenuItem} parameter—when the system +calls this method, it passes the menu item selected. For more information and an example, see the Menu Resource document.

    + +

    Tip: If your application contains multiple activities and +some of them provide the same options menu, consider creating +an activity that implements nothing except the {@link android.app.Activity#onCreateOptionsMenu(Menu) +onCreateOptionsMenu()} and {@link android.app.Activity#onOptionsItemSelected(MenuItem) +onOptionsItemSelected()} methods. Then extend this class for each activity that should share the +same options menu. This way, you can manage one set of code for handling menu +actions and each descendant class inherits the menu behaviors. +If you want to add menu items to one of the descendant activities, +override {@link android.app.Activity#onCreateOptionsMenu(Menu) +onCreateOptionsMenu()} in that activity. Call {@code super.onCreateOptionsMenu(menu)} so the +original menu items are created, then add new menu items with {@link +android.view.Menu#add(int,int,int,int) menu.add()}. You can also override the super class's +behavior for individual menu items.

    + + +

    Changing menu items at runtime

    + +

    After the system calls {@link android.app.Activity#onCreateOptionsMenu(Menu) +onCreateOptionsMenu()}, it retains an instance of the {@link android.view.Menu} you populate and +will not call {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} +again unless the menu is invalidated for some reason. However, you should use {@link +android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} only to create the initial +menu state and not to make changes during the activity lifecycle.

    + +

    If you want to modify the options menu based on +events that occur during the activity lifecycle, you can do so in +the {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()} method. This +method passes you the {@link android.view.Menu} object as it currently exists so you can modify it, +such as add, remove, or disable items. (Fragments also provide an {@link +android.app.Fragment#onPrepareOptionsMenu onPrepareOptionsMenu()} callback.)

    + +

    On Android 2.3.x and lower, the system calls {@link +android.app.Activity#onPrepareOptionsMenu(Menu) +onPrepareOptionsMenu()} each time the user opens the options menu (presses the Menu +button).

    + +

    On Android 3.0 and higher, the options menu is considered to always be open when menu items are +presented in the action bar. When an event occurs and you want to perform a menu update, you must +call {@link android.app.Activity#invalidateOptionsMenu invalidateOptionsMenu()} to request that the +system call {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}.

    + +

    Note: +You should never change items in the options menu based on the {@link android.view.View} currently +in focus. When in touch mode (when the user is not using a trackball or d-pad), views +cannot take focus, so you should never use focus as the basis for modifying +items in the options menu. If you want to provide menu items that are context-sensitive to a {@link +android.view.View}, use a Context Menu.

    + + + + +

    Creating Contextual Menus

    + +
    + +

    Figure 3. Screenshots of a floating context menu (left) +and the contextual action bar (right).

    +
    + +

    A contextual menu offers actions that affect a specific item or context frame in the UI. You +can provide a context menu for any view, but they are most often used for items in a {@link +android.widget.ListView}, {@link android.widget.GridView}, or other view collections in which +the user can perform direct actions on each item.

    + +

    There are two ways to provide contextual actions:

    +
      +
    • In a floating context menu. A menu appears as a +floating list of menu items (similar to a dialog) when the user performs a long-click (press and +hold) on a view that declares support for a context menu. Users can perform a contextual +action on one item at a time.
    • + +
    • In the contextual action mode. This mode is a system implementation of +{@link android.view.ActionMode} that displays a contextual action bar at the top of the +screen with action items that affect the selected item(s). When this mode is active, users +can perform an action on multiple items at once (if your app allows it).
    • +
    + +

    Note: The contextual action mode is available on Android 3.0 (API +level 11) and higher and is the preferred technique for displaying contextual actions when +available. If your app supports versions lower than 3.0 then you should fall back to a floating +context menu on those devices.

    + + +

    Creating a floating context menu

    + +

    To provide a floating context menu:

    +
      +
    1. Register the {@link android.view.View} to which the context menu should be associated by +calling {@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()} and pass +it the {@link android.view.View}. +

      If your activity uses a {@link android.widget.ListView} or {@link android.widget.GridView} and +you want each item to provide the same context menu, register all items for a context menu by +passing the {@link android.widget.ListView} or {@link android.widget.GridView} to {@link +android.app.Activity#registerForContextMenu(View) registerForContextMenu()}.

      +
    2. + +
    3. Implement the {@link +android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()} method +in your {@link android.app.Activity} or {@link android.app.Fragment}. +

      When the registered view receives a long-click event, the system calls your {@link +android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()} +method. This is where you define the menu items, usually by inflating a menu resource. For +example:

      +
      +@Override
      +public void onCreateContextMenu(ContextMenu menu, View v,
      +                                ContextMenuInfo menuInfo) {
      +    super.onCreateContextMenu(menu, v, menuInfo);
      +    MenuInflater inflater = getMenuInflater();
      +    inflater.inflate(R.menu.context_menu, menu);
      +}
      +
      + +

      {@link android.view.MenuInflater} allows you to inflate the context menu from a menu resource. The callback method +parameters include the {@link android.view.View} +that the user selected and a {@link android.view.ContextMenu.ContextMenuInfo} object that provides +additional information about the item selected. If your activity has several views that each provide +a different context menu, you might use these parameters to determine which context menu to +inflate.

      +
    4. + +
    5. Implement {@link android.app.Activity#onContextItemSelected(MenuItem) +onContextItemSelected()}. +

      When the user selects a menu item, the system calls this method so you can perform the +appropriate action. For example:

      + +
      +@Override
      +public boolean onContextItemSelected(MenuItem item) {
      +    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
      +    switch (item.getItemId()) {
      +        case R.id.edit:
      +            editNote(info.id);
      +            return true;
      +        case R.id.delete:
      +            deleteNote(info.id);
      +            return true;
      +        default:
      +            return super.onContextItemSelected(item);
      +    }
      +}
      +
      + +

      The {@link android.view.MenuItem#getItemId()} method queries the ID for +the selected menu item, which you should assign to each menu item in XML using the {@code +android:id} attribute, as shown in the section about Defining a Menu in +XML.

      + +

      When you successfully handle a menu item, return {@code true}. If you don't handle the menu item, +you should pass the menu item to the superclass implementation. If your activity includes fragments, +the activity receives this callback first. By calling the superclass when unhandled, the system +passes the event to the respective callback method in each fragment, one at a time (in the order +each fragment was added) until {@code true} or {@code false} is returned. (The default +implementation for {@link android.app.Activity} and {@code android.app.Fragment} return {@code +false}, so you should always call the superclass when unhandled.)

      +
    6. +
    + + +

    Using the contextual action mode

    + +

    The contextual action mode is a system implementation of {@link android.view.ActionMode} that +focuses user interaction toward performing contextual actions. When a +user enables this mode by selecting an item, a contextual action bar appears at the top of +the screen to present actions the user can perform on the currently selected item(s). While this +mode is enabled, the user can select multiple items (if you allow it), deselect items, and continue +to navigate within the activity (as much as you're willing to allow). The action mode is disabled +and the contextual action bar disappears when the user deselects all items, presses the BACK button, +or selects the Done action on the left side of the bar.

    + +

    Note: The contextual action bar is not necessarily +associated with the action bar. They operate +independently, even though the contextual action bar visually overtakes the action bar +position.

    + +

    If you're developing for Android 3.0 (API level 11) or higher, you +should usually use the contextual action mode to present contextual actions, instead of the floating context menu.

    + +

    For views that provide contextual actions, you should usually invoke the contextual action mode +upon one of two events (or both):

    +
      +
    • The user performs a long-click on the view.
    • +
    • The user selects a checkbox or similar UI component within the view.
    • +
    + +

    How your application invokes the contextual action mode and defines the behavior for each +action depends on your design. There are basically two designs:

    +
      +
    • For contextual actions on individual, arbitrary views.
    • +
    • For batch contextual actions on groups of items in a {@link +android.widget.ListView} or {@link android.widget.GridView} (allowing the user to select multiple +items and perform an action on them all).
    • +
    + +

    The following sections describe the setup required for each scenario.

    + + +

    Enabling the contextual action mode for individual views

    + +

    If you want to invoke the contextual action mode only when the user selects specific +views, you should:

    +
      +
    1. Implement the {@link android.view.ActionMode.Callback} interface. In its callback methods, you +can specify the actions for the contextual action bar, respond to click events on action items, and +handle other lifecycle events for the action mode.
    2. +
    3. Call {@link android.app.Activity#startActionMode startActionMode()} when you want to show the +bar (such as when the user long-clicks the view).
    4. +
    + +

    For example:

    + +
      +
    1. Implement the {@link android.view.ActionMode.Callback ActionMode.Callback} interface: +
      +private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
      +
      +    // Called when the action mode is created; startActionMode() was called
      +    @Override
      +    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
      +        // Inflate a menu resource providing context menu items
      +        MenuInflater inflater = mode.getMenuInflater();
      +        inflater.inflate(R.menu.context_menu, menu);
      +        return true;
      +    }
      +
      +    // Called each time the action mode is shown. Always called after onCreateActionMode, but
      +    // may be called multiple times if the mode is invalidated.
      +    @Override
      +    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
      +        return false; // Return false if nothing is done
      +    }
      +
      +    // Called when the user selects a contextual menu item
      +    @Override
      +    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
      +        switch (item.getItemId()) {
      +            case R.id.menu_share:
      +                shareCurrentItem();
      +                mode.finish(); // Action picked, so close the CAB
      +                return true;
      +            default:
      +                return false;
      +        }
      +    }
      +
      +    // Called when the user exits the action mode
      +    @Override
      +    public void onDestroyActionMode(ActionMode mode) {
      +        mActionMode = null;
      +    }
      +};
      +
      + +

      Notice that these event callbacks are almost exactly the same as the callbacks for the options menu, except each of these also pass the {@link +android.view.ActionMode} object associated with the event. You can use {@link +android.view.ActionMode} APIs to make various changes to the CAB, such as revise the title and +subtitle with {@link android.view.ActionMode#setTitle setTitle()} and {@link +android.view.ActionMode#setSubtitle setSubtitle()} (useful to indicate how many items are +selected).

      + +

      Also notice that the above sample sets the {@code mActionMode} variable null when the +action mode is destroyed. In the next step, you'll see how it's initialized and how saving +the member variable in your activity or fragment can be useful.

      +
    2. + +
    3. Call {@link android.app.Activity#startActionMode startActionMode()} to enable the contextual +action mode when appropriate, such as in response to a long-click on a {@link +android.view.View}:

      + +
      +someView.setOnLongClickListener(new View.OnLongClickListener() {
      +    // Called when the user long-clicks on someView
      +    public boolean onLongClick(View view) {
      +        if (mActionMode != null) {
      +            return false;
      +        }
      +
      +        // Start the CAB using the ActionMode.Callback defined above
      +        mActionMode = getActivity().startActionMode(mActionModeCallback);
      +        view.setSelected(true);
      +        return true;
      +    }
      +});
      +
      + +

      When you call {@link android.app.Activity#startActionMode startActionMode()}, the system returns +the {@link android.view.ActionMode} created. By saving this in a member variable, you can +make changes to the contextual action bar in response to other events. In the above sample, the +{@link android.view.ActionMode} is used to ensure that the {@link android.view.ActionMode} instance +is not recreated if it's already active, by checking whether the member is null before starting the +action mode.

      +
    4. +
    + + + +

    Enabling batch contextual actions in a ListView or GridView

    + +

    If you have a collection of items in a {@link android.widget.ListView} or {@link +android.widget.GridView} (or another extension of {@link android.widget.AbsListView}) and want to +allow users to perform batch actions, you should:

    + +
      +
    • Implement the {@link android.widget.AbsListView.MultiChoiceModeListener} interface and set it +for the view group with {@link android.widget.AbsListView#setMultiChoiceModeListener +setMultiChoiceModeListener()}. In the listener's callback methods, you can specify the actions +for the contextual action bar, respond to click events on action items, and handle other callbacks +inherited from the {@link android.view.ActionMode.Callback} interface.
    • + +
    • Call {@link android.widget.AbsListView#setChoiceMode setChoiceMode()} with the {@link +android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL} argument.
    • +
    + +

    For example:

    + +
    +ListView listView = getListView();
    +listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    +listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
    +
    +    @Override
    +    public void onItemCheckedStateChanged(ActionMode mode, int position,
    +                                          long id, boolean checked) {
    +        // Here you can do something when items are selected/de-selected,
    +        // such as update the title in the CAB
    +    }
    +
    +    @Override
    +    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    +        // Respond to clicks on the actions in the CAB
    +        switch (item.getItemId()) {
    +            case R.id.menu_delete:
    +                deleteSelectedItems();
    +                mode.finish(); // Action picked, so close the CAB
    +                return true;
    +            default:
    +                return false;
    +        }
    +    }
    +
    +    @Override
    +    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    +        // Inflate the menu for the CAB
    +        MenuInflater inflater = mode.getMenuInflater();
    +        inflater.inflate(R.menu.context, menu);
    +        return true;
    +    }
    +
    +    @Override
    +    public void onDestroyActionMode(ActionMode mode) {
    +        // Here you can make any necessary updates to the activity when
    +        // the CAB is removed. By default, selected items are deselected/unchecked.
    +    }
    +
    +    @Override
    +    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    +        // Here you can perform updates to the CAB due to
    +        // an {@link android.view.ActionMode#invalidate} request
    +        return false;
    +    }
    +});
    +
    + +

    That's it. Now when the user selects an item with a long-click, the system calls the {@link +android.widget.AbsListView.MultiChoiceModeListener#onCreateActionMode onCreateActionMode()} +method and displays the contextual action bar with the specified actions. While the contextual +action bar is visible, users can select additional items.

    + +

    In some cases in which the contextual actions provide common action items, you might +want to add a checkbox or a similar UI element that allows users to select items, because they +might not discover the long-click behavior. When a user selects the checkbox, you +can invoke the contextual action mode by setting the respective list item to the checked +state with {@link android.widget.AbsListView#setItemChecked setItemChecked()}.

    + + + + +

    Creating a Popup Menu

    + +
    + +

    Figure 4. A popup menu in the Gmail app, anchored to the overflow +button at the top-right.

    +
    + +

    A {@link android.widget.PopupMenu} is a modal menu anchored to a {@link android.view.View}. +It appears below the anchor view if there is room, or above the view otherwise. It's useful for:

    +
      +
    • Providing an overflow-style menu for actions that relate to specific content (such as +Gmail's email headers, shown in figure 4). +

      Note: This is not the same as a context menu, which is +generally for actions that affect selected content. For actions that affect selected +content, use the contextual action mode or floating context menu.

    • +
    • Providing a second part of a command sentence (such as a button marked "Add" +that produces a popup menu with different "Add" options).
    • +
    • Providing a drop-down similar to {@link android.widget.Spinner} that does not retain +a persistent selection.
    • +
    + + +

    Note: {@link android.widget.PopupMenu} is available with API +level 11 and higher.

    + +

    If you define your menu in XML, here's how you can show the popup menu:

    +
      +
    1. Instantate a {@link android.widget.PopupMenu} with its constructor, which takes the +current application {@link android.content.Context} and the {@link android.view.View} to which the +menu should be anchored.
    2. +
    3. Use {@link android.view.MenuInflater} to inflate your menu resource into the {@link +android.view.Menu} object returned by {@link +android.widget.PopupMenu#getMenu() PopupMenu.getMenu()}. On API level 14 and above, you can use +{@link android.widget.PopupMenu#inflate PopupMenu.inflate()} instead.
    4. +
    5. Call {@link android.widget.PopupMenu#show() PopupMenu.show()}.
    6. +
    + +

    For example, here's a button with the {@link android.R.attr#onClick android:onClick} attribute +that shows a popup menu:

    + +
    +<ImageButton
    +    android:layout_width="wrap_content" 
    +    android:layout_height="wrap_content" 
    +    android:src="@drawable/ic_overflow_holo_dark"
    +    android:contentDescription="@string/descr_overflow_button"
    +    android:onClick="showPopup" />
    +
    + +

    The activity can then show the popup menu like this:

    + +
    +public void showPopup(View v) {
    +    PopupMenu popup = new PopupMenu(this, v);
    +    MenuInflater inflater = popup.getMenuInflater();
    +    inflater.inflate(R.menu.actions, popup.getMenu());
    +    popup.show();
    +}
    +
    + +

    In API level 14 and higher, you can combine the two lines that inflate the menu with {@link +android.widget.PopupMenu#inflate PopupMenu.inflate()}.

    + +

    The menu is dismissed when the user selects an item or touches outside the menu +area. You can listen for the dismiss event using {@link +android.widget.PopupMenu.OnDismissListener}.

    + +

    Handling click events

    + +

    To perform an +action when the user selects a menu item, you must implement the {@link +android.widget.PopupMenu.OnMenuItemClickListener} interface and register it with your {@link +android.widget.PopupMenu} by calling {@link android.widget.PopupMenu#setOnMenuItemClickListener +setOnMenuItemclickListener()}. When the user selects an item, the system calls the {@link +android.widget.PopupMenu.OnMenuItemClickListener#onMenuItemClick onMenuItemClick()} callback in +your interface.

    + +

    For example:

    + +
    +public void showMenu(View v) {
    +    PopupMenu popup = new PopupMenu(this, v);
    +
    +    // This activity implements OnMenuItemClickListener
    +    popup.setOnMenuItemClickListener(this);
    +    popup.inflate(R.menu.actions);
    +    popup.show();
    +}
    +
    +@Override
    +public boolean onMenuItemClick(MenuItem item) {
    +    switch (item.getItemId()) {
    +        case R.id.archive:
    +            archive(item);
    +            return true;
    +        case R.id.delete:
    +            delete(item);
    +            return true;
    +        default:
    +            return false;
    +    }
    +}
    +
    + + +

    Creating Menu Groups

    A menu group is a collection of menu items that share certain traits. With a group, you can:

    @@ -473,38 +842,41 @@ android.view.Menu#add(int,int,int,int) add()} method.

     <?xml version="1.0" encoding="utf-8"?>
     <menu xmlns:android="http://schemas.android.com/apk/res/android">
    -    <item android:id="@+id/item1"
    -          android:icon="@drawable/item1"
    -          android:title="@string/item1" />
    +    <item android:id="@+id/menu_save"
    +          android:icon="@drawable/menu_save"
    +          android:title="@string/menu_save" />
         <!-- menu group -->
    -    <group android:id="@+id/group1">
    -        <item android:id="@+id/groupItem1"
    -              android:title="@string/groupItem1" />
    -        <item android:id="@+id/groupItem2"
    -              android:title="@string/groupItem2" />
    +    <group android:id="@+id/group_delete">
    +        <item android:id="@+id/menu_archive"
    +              android:title="@string/menu_archive" />
    +        <item android:id="@+id/menu_delete"
    +              android:title="@string/menu_delete" />
         </group>
     </menu>
     
    -

    The items that are in the group appear the same as the first item that is not in a -group—all three items in the menu are siblings. However, you can modify the traits of the two -items in the group by referencing the group ID and using the methods listed above.

    +

    The items that are in the group appear at the same level as the first item—all three items +in the menu are siblings. However, you can modify the traits of the two +items in the group by referencing the group ID and using the methods listed above. The system +will also never separate grouped items. For example, if you declare {@code +android:showAsAction="ifRoom"} for each item, they will either both appear in the action +bar or both appear in the action overflow.

    -

    Checkable menu items

    +

    Using checkable menu items

    -

    Figure 3. Screenshot of a submenu with checkable +

    Figure 5. Screenshot of a submenu with checkable items.

    A menu can be useful as an interface for turning options on and off, using a checkbox for stand-alone options, or radio buttons for groups of -mutually exclusive options. Figure 2 shows a submenu with items that are checkable with radio +mutually exclusive options. Figure 5 shows a submenu with items that are checkable with radio buttons.

    -

    Note: Menu items in the Icon Menu (from the Options Menu) cannot +

    Note: Menu items in the Icon Menu (from the options menu) cannot display a checkbox or radio button. If you choose to make items in the Icon Menu checkable, you must manually indicate the checked state by swapping the icon and/or text each time the state changes.

    @@ -550,15 +922,15 @@ user selected it) with {@link android.view.MenuItem#isChecked()} and then set th
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
    -  switch (item.getItemId()) {
    -  case R.id.vibrate:
    -  case R.id.dont_vibrate:
    -    if (item.isChecked()) item.setChecked(false);
    -    else item.setChecked(true);
    -    return true;
    -  default:
    -    return super.onOptionsItemSelected(item);
    -  }
    +    switch (item.getItemId()) {
    +        case R.id.vibrate:
    +        case R.id.dont_vibrate:
    +            if (item.isChecked()) item.setChecked(false);
    +            else item.setChecked(true);
    +            return true;
    +        default:
    +            return super.onOptionsItemSelected(item);
    +    }
     }
     
    @@ -575,30 +947,8 @@ you should store the data using Shared Preferences.

    -

    Shortcut keys

    -

    To facilitate quick access to items in the Options Menu when the user's device has a hardware -keyboard, you can add quick-access shortcut keys using letters and/or numbers, with the -{@code android:alphabeticShortcut} and {@code android:numericShortcut} attributes in the {@code -<item>} element. You can also use the methods {@link -android.view.MenuItem#setAlphabeticShortcut(char)} and {@link -android.view.MenuItem#setNumericShortcut(char)}. Shortcut keys are not -case sensitive.

    - -

    For example, if you apply the "s" character as an alphabetic shortcut to a "save" menu item, then -when the menu is open (or while the user holds the MENU button) and the user presses the "s" key, -the "save" menu item is selected.

    - -

    This shortcut key is displayed as a tip in the menu item, below the menu item name -(except for items in the Icon Menu, which are displayed only if the user holds the MENU -button).

    - -

    Note: Shortcut keys for menu items only work on devices with a -hardware keyboard. Shortcuts cannot be added to items in a Context Menu.

    - - - -

    Dynamically adding menu intents

    +

    Adding Menu Items Based on an Intent

    Sometimes you'll want a menu item to launch an activity using an {@link android.content.Intent} (whether it's an activity in your application or another application). When you know the intent you @@ -671,7 +1021,7 @@ addIntentOptions()}, it overrides any and all menu items by the menu group speci argument.

    -

    Allowing your activity to be added to other menus

    +

    Allowing your activity to be added to other menus

    You can also offer the services of your activity to other applications, so your application can be included in the menu of others (reverse the roles described above).

    @@ -681,7 +1031,7 @@ filter as usual, but be sure to include the {@link android.content.Intent#CATEGO and/or {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} values for the intent filter category. For example:

    -<intent-filter label="Resize Image">
    +<intent-filter label="@string/resize_image">
         ...
         <category android:name="android.intent.category.ALTERNATIVE" />
         <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    diff --git a/docs/html/images/ui/menu-context.png b/docs/html/images/ui/menu-context.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..f6975fbf2df445fe312d9f349b7524462c1893d4
    GIT binary patch
    literal 45304
    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
    MAW(+oaOcSX0onG26#xJL
    
    literal 0
    HcmV?d00001
    
    diff --git a/docs/html/images/ui/popupmenu.png b/docs/html/images/ui/popupmenu.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..5c99821704615a6766a8232444144946d5a52db3
    GIT binary patch
    literal 8186
    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