• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=菜单
2parent.title=用户界面
3parent.link=index.html
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8  <h2>本文内容</h2>
9<ol>
10  <li><a href="#xml">使用 XML 定义菜单</a></li>
11  <li><a href="#options-menu">创建选项菜单</a>
12    <ol>
13      <li><a href="#RespondingOptionsMenu">处理点击事件</a></li>
14      <li><a href="#ChangingTheMenu">在运行时更改菜单项</a></li>
15    </ol>
16  </li>
17  <li><a href="#context-menu">创建上下文菜单</a>
18    <ol>
19      <li><a href="#FloatingContextMenu">创建浮动上下文菜单</a></li>
20      <li><a href="#CAB">使用上下文操作模式</a></li>
21    </ol>
22  </li>
23  <li><a href="#PopupMenu">创建弹出菜单</a>
24    <ol>
25      <li><a href="#PopupEvents">处理点击事件</a></li>
26    </ol>
27  </li>
28  <li><a href="#groups">创建菜单组</a>
29    <ol>
30      <li><a href="#checkable">使用可选中的菜单项</a></li>
31    </ol>
32  </li>
33  <li><a href="#intents">添加基于 Intent 的菜单项</a>
34    <ol>
35      <li><a href="#AllowingToAdd">允许将 Activity 添加到其他菜单中</a></li>
36    </ol>
37  </li>
38</ol>
39
40  <h2>关键类</h2>
41  <ol>
42    <li>{@link android.view.Menu}</li>
43    <li>{@link android.view.MenuItem}</li>
44    <li>{@link android.view.ContextMenu}</li>
45    <li>{@link android.view.ActionMode}</li>
46  </ol>
47
48  <h2>另请参阅</h2>
49  <ol>
50    <li><a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a></li>
51    <li><a href="{@docRoot}guide/topics/resources/menu-resource.html">菜单资源</a></li>
52    <li><a href="http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html">从此告别菜单按钮</a>
53</li>
54  </ol>
55</div>
56</div>
57
58<p>菜单是许多应用中常见的用户界面组件。要提供熟悉而一致的用户体验,您应使用 {@link android.view.Menu} API
59呈现 Activity 中的用户操作和其他选项。
60</p>
61
62<p>从
63Android 3.0(API 级别 11)开始,采用 Android 技术的设备不必再提供一个专用“菜单”按钮。<em></em>随着这种改变,Android
64应用需摆脱对包含
656 个项目的传统菜单面板的依赖,取而代之的是要提供一个操作栏来呈现常见的用户操作。</p>
66
67<p>尽管某些菜单项的设计和用户体验已发生改变,但定义一系列操作和选项所使用的语义仍是以
68{@link android.view.Menu} API 为基础。本指南将介绍所有
69Android 版本系统中三种基本菜单或操作呈现效果的创建方法:
70</p>
71
72<dl>
73  <dt><strong>选项菜单和操作栏</strong></dt>
74    <dd><a href="#options-menu">选项菜单</a>是某个 Activity 的主菜单项,
75供您放置对应用产生全局影响的操作,如“搜索”、“撰写电子邮件”和“设置”。
76
77  <p>如果您的应用是针对
78Android 2.3 或更低版本的系统而开发,则用户可以通过按“菜单”按钮显示选项菜单面板。<em></em></p>
79  <p>在
80Android 3.0 及更高版本的系统中,<a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a>以屏幕操作项和溢出选项的组合形式呈现选项菜单中的各项。从 Android 3.0 开始,“菜单”按钮已弃用(某些设备没有该按钮),因此您应改为使用操作栏,来提供对操作和其他选项的访问。<em></em>
81
82
83</p>
84  <p>请参阅<a href="#options-menu">创建选项菜单</a>部分。</p>
85    </dd>
86
87  <dt><strong>上下文菜单和上下文操作模式</strong></dt>
88
89   <dd>上下文菜单是用户长按某一元素时出现的<a href="#FloatingContextMenu">浮动菜单</a>。
90它提供的操作将影响所选内容或上下文框架。
91
92  <p>开发针对 Android 3.0 及更高版本系统的应用时,您应改为使用<a href="#CAB">上下文操作模式</a>,以便对所选内容启用操作。此模式在屏幕顶部栏显示影响所选内容的操作项目,并允许用户选择多项。
93
94</p>
95  <p>请参阅<a href="#context-menu">创建上下文菜单</a>部分。</p>
96</dd>
97
98  <dt><strong>弹出菜单</strong></dt>
99    <dd>弹出菜单将以垂直列表形式显示一系列项目,这些项目将锚定到调用该菜单的视图中。
100它特别适用于提供与特定内容相关的大量操作,或者为命令的另一部分提供选项。
101弹出菜单中的操作<strong>不会</strong>直接影响对应的内容,而上下文操作则会影响。
102
103相反,弹出菜单适用于与您 Activity 中的内容区域相关的扩展操作。
104
105  <p>请参阅<a href="#PopupMenu">创建弹出菜单</a>部分。</p>
106</dd>
107</dl>
108
109
110
111<h2 id="xml">使用 XML 定义菜单</h2>
112
113<p>对于所有菜单类型,Android
114提供了标准的 XML 格式来定义菜单项。您应在
115XML <a href="{@docRoot}guide/topics/resources/menu-resource.html">菜单资源</a>中定义菜单及其所有项,而不是在 Activity 的代码中构建菜单。定义后,您可以在 Activity 或片段中扩充菜单资源(将其作为
116{@link android.view.Menu}
117对象加载)。</p>
118
119<p>使用菜单资源是一种很好的做法,原因如下:</p>
120<ul>
121  <li>更易于使用 XML 可视化菜单结构</li>
122  <li>将菜单内容与应用的行为代码分离</li>
123  <li>允许您利用<a href="{@docRoot}guide/topics/resources/index.html">应用资源</a>框架,为不同的平台版本、屏幕尺寸和其他配置创建备用菜单配置
124</li>
125</ul>
126
127<p>要定义菜单,请在项目 <code>res/menu/</code>
128目录内创建一个 XML 文件,并使用以下元素构建菜单:</p>
129<dl>
130  <dt><code>&lt;menu></code></dt>
131    <dd>定义 {@link android.view.Menu},即菜单项的容器。<code>&lt;menu></code>
132元素必须是该文件的根节点,并且能够包含一个或多个
133<code>&lt;item></code> 和 <code>&lt;group></code> 元素。</dd>
134
135  <dt><code>&lt;item></code></dt>
136    <dd>创建 {@link android.view.MenuItem},此元素表示菜单中的一项,可能包含嵌套的 <code>&lt;menu></code>
137元素,以便创建子菜单。</dd>
138
139  <dt><code>&lt;group></code></dt>
140    <dd>{@code &lt;item&gt;} 元素的不可见容器(可选)。它支持您对菜单项进行分类,使其共享活动状态和可见性等属性。
141如需了解详细信息,请参阅<a href="#groups">创建菜单组</a>部分。
142</dd>
143</dl>
144
145
146<p>以下是名为 <code>game_menu.xml</code> 的菜单示例:</p>
147<pre>
148&lt;?xml version="1.0" encoding="utf-8"?&gt;
149&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
150    &lt;item android:id="@+id/new_game"
151          android:icon="@drawable/ic_new_game"
152          android:title="@string/new_game"
153          android:showAsAction="ifRoom"/&gt;
154    &lt;item android:id="@+id/help"
155          android:icon="@drawable/ic_help"
156          android:title="@string/help" /&gt;
157&lt;/menu&gt;
158</pre>
159
160<p><code>&lt;item></code>
161元素支持多个属性,您可使用这些属性定义项目的外观和行为。上述菜单中的项目包括以下属性:</p>
162
163<dl>
164  <dt>{@code android:id}</dt>
165    <dd>项目特有的资源
166ID,让应用能够在用户选择项目时识别该项目。</dd>
167  <dt>{@code android:icon}</dt>
168    <dd>引用一个要用作项目图标的 Drawable 类。</dd>
169  <dt>{@code android:title}</dt>
170    <dd>引用一个要用作项目标题的字符串。</dd>
171  <dt>{@code android:showAsAction}</dt>
172    <dd>指定此项应作为操作项目显示在<a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a>中的时间和方式。</dd>
173</dl>
174
175<p>这些是您应使用的最重要属性,但还有许多其他属性。有关所有受支持属性的信息,请参阅<a href="{@docRoot}guide/topics/resources/menu-resource.html">菜单资源</a>文档。
176</p>
177
178<p>您可以通过以 {@code &lt;item&gt;}
179子元素的形式添加 {@code &lt;menu&gt;} 元素,向任何菜单(子菜单除外)中的某个菜单项添加子菜单。当应用具有大量可按主题进行组织的功能时,类似于 PC 应用程序菜单栏中的菜单项(“文件”、“编辑”、“视图”等),子菜单非常有用。
180
181例如:</p>
182
183<pre>
184&lt;?xml version="1.0" encoding="utf-8"?&gt;
185&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
186    &lt;item android:id="@+id/file"
187          android:title="@string/file" &gt;
188        &lt;!-- "file" submenu --&gt;
189        &lt;menu&gt;
190            &lt;item android:id="@+id/create_new"
191                  android:title="@string/create_new" /&gt;
192            &lt;item android:id="@+id/open"
193                  android:title="@string/open" /&gt;
194        &lt;/menu&gt;
195    &lt;/item&gt;
196&lt;/menu&gt;
197</pre>
198
199<p>要在 Activity 中使用菜单,您需要使用 {@link android.view.MenuInflater#inflate(int,Menu)
200MenuInflater.inflate()} 扩充菜单资源(将 XML
201资源转换为可编程对象)。在下文中,您将了解如何扩充每种类型的菜单。
202</p>
203
204
205
206<h2 id="options-menu">创建选项菜单</h2>
207
208<div class="figure" style="width:200px;margin:0">
209  <img src="{@docRoot}images/options_menu.png" height="333" alt="" />
210  <p class="img-caption"><strong>图 1. </strong>Android 2.3 系统上浏览器
211中的选项菜单。</p>
212</div>
213
214<p>在选项菜单中,您应当包括与当前 Activity 上下文相关的操作和其他选项,如“搜索”、“撰写电子邮件”和“设置”。
215</p>
216
217<p>选项菜单中的项目在屏幕上的显示位置取决于您开发的应用所适用的 Android 版本:
218</p>
219
220<ul>
221  <li>如果您开发的应用是用于
222<strong>Android
2232.3.x(API 级别 10)或更低版本</strong>的系统,则当用户按“菜单”按钮时,选项菜单的内容会出现在屏幕底部,如图 1 所示。<em></em>打开时,第一个可见部分是图标菜单,其中包含多达 6 个菜单项。
224
225如果菜单包括 6 个以上项目,则
226Android
227会将第六项和其余项目放入溢出菜单。用户可以通过选择“更多”打开该菜单。<em></em></li>
228
229  <li>如果您开发的应用是用于 <strong>Android
2303.0(API 级别 11)及更高版本</strong>的系统,则选项菜单中的项目将出现在<a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a>中。默认情况下,系统会将所有项目均放入操作溢出菜单中。用户可以使用操作栏右侧的操作溢出菜单图标(或者,通过按设备“菜单”按钮(如有))显示操作溢出菜单。
231
232<em></em>要支持快速访问重要操作,您可以将
233{@code android:showAsAction="ifRoom"}
234添加到对应的
235{@code &lt;item&gt;} 元素,从而将几个项目提升到操作栏中(请参阅图
2362)。 <p>如需了解有关操作项目和其他操作栏行为的详细信息,请参阅<a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a>指南。 </p>
237<p class="note"><strong>注:</strong>即使您的应用不是针对
238Android 3.0 或更高版本的系统而开发,但仍可构建自己的操作栏布局,以获得类似的效果。<em></em>有关如何使用操作栏支持旧版
239Android
240的示例,请参阅<a href="{@docRoot}resources/samples/ActionBarCompat/index.html">操作栏兼容性</a>示例。</p>
241</li>
242</ul>
243
244<img src="{@docRoot}images/ui/actionbar.png" alt="" />
245<p class="img-caption"><strong>图 2. </strong>摘自
246<a href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a> 应用的操作栏,其中显示了导航选项卡和相机操作项目(以及操作溢出菜单按钮)。</p>
247
248<p>您可以通过 {@link android.app.Activity}
249子类或 {@link android.app.Fragment} 子类为选项菜单声明项目。如果您的 Activity 和片段均为选项菜单声明项目,则这些项目将合并到
250UI 中。系统将首先显示 Activity 的项目,随后按每个片段添加到 Activity 中的顺序显示该片段的项目。
251
252如有必要,您可以使用 {@code android:orderInCategory}
253属性,对需要移动的每个 {@code &lt;item&gt;} 中的菜单项重新排序。</p>
254
255<p>要为 Activity 指定选项菜单,请重写 {@link
256android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}(Fragment 会提供自己的
257{@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()} 回调)。通过此方法,您可以将菜单资源(<a href="#xml">使用
258XML</a> 定义)扩充到回调中提供的 {@link
259android.view.Menu} 中。例如:</p>
260
261<pre>
262&#64;Override
263public boolean onCreateOptionsMenu(Menu menu) {
264    MenuInflater inflater = {@link android.app.Activity#getMenuInflater()};
265    inflater.inflate(R.menu.game_menu, menu);
266    return true;
267}
268</pre>
269
270<p>此外,您还可以使用 {@link android.view.Menu#add(int,int,int,int)
271add()} 添加菜单项,并使用
272{@link android.view.Menu#findItem findItem()} 检索项目,以便使用 {@link android.view.MenuItem} API 修改其属性。</p>
273
274<p>如果您开发的应用是用于 Android 2.3.x 及更低版本的系统,则当用户首次打开选项菜单时,系统会调用 {@link
275android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}
276来创建该菜单。如果您开发的应用是用于
277Android 3.0 及更高版本的系统,则系统将在启动 Activity 时调用
278{@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()},以便向操作栏显示项目。</p>
279
280
281
282<h3 id="RespondingOptionsMenu">处理点击事件</h3>
283
284<p>用户从选项菜单中选择项目(包括操作栏中的操作项目)时,系统将调用 Activity 的
285{@link android.app.Activity#onOptionsItemSelected(MenuItem)
286onOptionsItemSelected()} 方法。此方法将传递所选的 {@link android.view.MenuItem}。您可以通过调用
287{@link android.view.MenuItem#getItemId()} 方法来识别项目,该方法将返回菜单项的唯一 ID(由菜单资源中的 {@code android:id} 属性定义,或通过提供给 {@link android.view.Menu#add(int,int,int,int) add()}
288方法的整型数定义)。
289您可以将此
290ID 与已知的菜单项匹配,以执行适当的操作。例如:</p>
291
292<pre>
293&#64;Override
294public boolean onOptionsItemSelected(MenuItem item) {
295    // Handle item selection
296    switch (item.getItemId()) {
297        case R.id.new_game:
298            newGame();
299            return true;
300        case R.id.help:
301            showHelp();
302            return true;
303        default:
304            return super.onOptionsItemSelected(item);
305    }
306}
307</pre>
308
309<p>成功处理菜单项后,系统将返回 {@code true}。如果未处理菜单项,则应调用 {@link
310android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}
311的超类实现(默认实现将返回 false)。
312</p>
313
314<p>如果 Activity 包括片段,则系统将依次为 Activity 和每个片段(按照每个片段的添加顺序)调用 {@link
315android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}
316,直到有一返回结果为
317{@code true} 或所有片段均调用完毕为止。</p>
318
319<p class="note"><strong>提示:</strong>Android 3.0 新增了一项功能,支持您在 XML 中使用 {@code android:onClick}
320属性为菜单项定义点击行为。该属性的值必须是 Activity 使用菜单定义的方法的名称。
321该方法必须是公用的,且接受单个
322{@link android.view.MenuItem}
323参数;当系统调用此方法时,它会传递所选的菜单项。如需了解详细信息和示例,请参阅<a href="{@docRoot}guide/topics/resources/menu-resource.html">菜单资源</a>文档。</p>
324
325<p class="note"><strong>提示:</strong>如果应用包含多个 Activity,且其中某些 Activity 提供相同的选项菜单,则可考虑创建一个仅实现
326{@link android.app.Activity#onCreateOptionsMenu(Menu)
327onCreateOptionsMenu()} 和 {@link android.app.Activity#onOptionsItemSelected(MenuItem)
328onOptionsItemSelected()}
329方法的 Activity。然后,为每个应共享相同选项菜单的 Activity 扩展此类。
330通过这种方式,您可以管理一个用于处理菜单操作的代码集,且每个子级类均会继承菜单行为。若要将菜单项添加到一个子级 Activity,请重写该 Activity 中的
331{@link android.app.Activity#onCreateOptionsMenu(Menu)
332onCreateOptionsMenu()}。
333
334调用 {@code super.onCreateOptionsMenu(menu)},以便创建原始菜单项,然后使用
335{@link
336android.view.Menu#add(int,int,int,int) menu.add()} 添加新菜单项。此外,您还可以替代各个菜单项的超类行为。
337</p>
338
339
340<h3 id="ChangingTheMenu">在运行时更改菜单项</h3>
341
342<p>系统调用
343{@link android.app.Activity#onCreateOptionsMenu(Menu)
344onCreateOptionsMenu()} 后,将保留您填充的 {@link android.view.Menu} 实例。除非菜单由于某些原因而失效,否则不会再次调用
345{@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}。但是,您仅应使用
346{@link
347android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} 来创建初始菜单状态,而不应使用它在 Activity 生命周期中执行任何更改。</p>
348
349<p>如需根据在 Activity 生命周期中发生的事件修改选项菜单,则可通过
350{@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}
351方法执行此操作。此方法向您传递
352{@link android.view.Menu}
353对象(因为该对象目前存在),以便您能够对其进行修改,如添加、删除或禁用项目。(此外,片段还提供 {@link
354android.app.Fragment#onPrepareOptionsMenu onPrepareOptionsMenu()} 回调。)</p>
355
356<p>在
357Android 2.3.x 及更低版本中,每当用户打开选项菜单时(按“菜单”按钮),系统均会调用 {@link
358android.app.Activity#onPrepareOptionsMenu(Menu)
359onPrepareOptionsMenu()}。<em></em></p>
360
361<p>在
362Android 3.0 及更高版本中,当菜单项显示在操作栏中时,选项菜单被视为始终处于打开状态。发生事件时,如果您要执行菜单更新,则必须调用
363{@link android.app.Activity#invalidateOptionsMenu invalidateOptionsMenu()} 来请求系统调用
364{@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}。</p>
365
366<p class="note"><strong>注:</strong>切勿根据目前处于焦点的
367{@link android.view.View}
368更改选项菜单中的项目。处于触摸模式(用户未使用轨迹球或方向键)时,视图无法形成焦点,因此切勿根据焦点修改选项菜单中的项目。
369
370若要为 {@link
371android.view.View} 提供上下文相关的菜单项,请使用<a href="#context-menu">上下文菜单</a>。</p>
372
373
374
375
376<h2 id="context-menu">创建上下文菜单</h2>
377
378<div class="figure" style="width:420px;margin-top:-1em">
379  <img src="{@docRoot}images/ui/menu-context.png" alt="" />
380  <p class="img-caption"><strong>图 3. </strong>浮动上下文菜单(左)和上下文操作栏(右)的屏幕截图。
381</p>
382</div>
383
384<p>上下文菜单提供了许多操作,这些操作影响 UI 中的特定项目或上下文框架。您可以为任何视图提供上下文菜单,但这些菜单通常用于
385{@link
386android.widget.ListView}、{@link android.widget.GridView}
387或用户可直接操作每个项目的其他视图集合中的项目。</p>
388
389<p>提供上下文操作的方法有两种:</p>
390<ul>
391  <li>使用<a href="#FloatingContextMenu">浮动上下文菜单</a>。用户长按(按住)一个声明支持上下文菜单的视图时,菜单显示为菜单项的浮动列表(类似于对话框)。
392
393用户一次可对一个项目执行上下文操作。
394</li>
395
396  <li>使用<a href="#CAB">上下文操作模式</a>。此模式是
397{@link android.view.ActionMode}
398的系统实现,它将在屏幕顶部显示上下文操作栏,其中包括影响所选项的操作项目。<em></em>当此模式处于活动状态时,用户可以同时对多项执行操作(如果应用允许)。
399</li>
400</ul>
401
402<p class="note"><strong>注:</strong>上下文操作模式可用于
403Android 3.0(API
404级别 11)及更高版本的系统,是显示上下文操作(如果可用)的首选方法。如果应用支持低于
4053.0 版本的系统,则应在这些设备上回退到浮动上下文菜单。</p>
406
407
408<h3 id="FloatingContextMenu">创建浮动上下文菜单</h3>
409
410<p>要提供浮动上下文菜单,请执行以下操作:</p>
411<ol>
412  <li>通过调用
413{@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()},注册应与上下文菜单关联的
414{@link android.view.View} 并将其传递给 {@link android.view.View}。
415  <p>如果 Activity 使用 {@link android.widget.ListView} 或 {@link android.widget.GridView}
416且您希望每个项目均提供相同的上下文菜单,请通过将
417{@link android.widget.ListView} 或 {@link android.widget.GridView} 传递给 {@link
418android.app.Activity#registerForContextMenu(View) registerForContextMenu()},为上下文菜单注册所有项目。</p>
419</li>
420
421  <li>在 {@link android.app.Activity} 或 {@link android.app.Fragment} 中实现 {@link
422android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()}
423方法。
424  <p>当注册后的视图收到长按事件时,系统将调用您的 {@link
425android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()}
426方法。在此方法中,您通常可通过扩充菜单资源来定义菜单项。例如:
427</p>
428<pre>
429&#64;Override
430public void onCreateContextMenu(ContextMenu menu, View v,
431                                ContextMenuInfo menuInfo) {
432    super.onCreateContextMenu(menu, v, menuInfo);
433    MenuInflater inflater = getMenuInflater();
434    inflater.inflate(R.menu.context_menu, menu);
435}
436</pre>
437
438<p>{@link android.view.MenuInflater} 允许您通过<a href="{@docRoot}guide/topics/resources/menu-resource.html">菜单资源</a>扩充上下文菜单。回调方法参数包括用户所选的
439{@link android.view.View},以及一个提供有关所选项的附加信息的
440{@link android.view.ContextMenu.ContextMenuInfo}
441对象。如果 Activity 有多个视图,每个视图均提供不同的上下文菜单,则可使用这些参数确定要扩充的上下文菜单。
442
443</p>
444</li>
445
446<li>实现 {@link android.app.Activity#onContextItemSelected(MenuItem)
447onContextItemSelected()}。
448  <p>用户选择菜单项时,系统将调用此方法,以便您能够执行适当的操作。
449例如:</p>
450
451<pre>
452&#64;Override
453public boolean onContextItemSelected(MenuItem item) {
454    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
455    switch (item.getItemId()) {
456        case R.id.edit:
457            editNote(info.id);
458            return true;
459        case R.id.delete:
460            deleteNote(info.id);
461            return true;
462        default:
463            return super.onContextItemSelected(item);
464    }
465}
466</pre>
467
468<p>{@link android.view.MenuItem#getItemId()}
469方法将查询所选菜单项的 ID,您应使用 {@code
470android:id} 属性将此 ID 分配给 XML 中的每个菜单项,如<a href="#xml">使用
471XML 定义菜单</a>部分所示。</p>
472
473<p>成功处理菜单项后,系统将返回 {@code true}。如果未处理菜单项,则应将菜单项传递给超类实现。
474如果 Activity 包括片段,则 Activity 将先收到此回调。
475通过在未处理的情况下调用超类,系统将事件逐一传递给每个片段中相应的回调方法(按照每个片段的添加顺序),直到返回
476{@code true} 或 {@code false}
477为止。({@link android.app.Activity}
478和 {@code android.app.Fragment} 的默认实现返回 {@code
479false},因此您始终应在未处理的情况下调用超类。)</p>
480</li>
481</ol>
482
483
484<h3 id="CAB">使用上下文操作模式</h3>
485
486<p>上下文操作模式是
487{@link android.view.ActionMode} 的一种系统实现,它将用户交互的重点转到执行上下文操作上。用户通过选择项目启用此模式时,屏幕顶部将出现一个“上下文操作栏”,显示用户可对当前所选项执行的操作。
488
489<em></em>启用此模式后,用户可以选择多个项目(若您允许)、取消选择项目以及继续在 Activity 内导航(在您允许的最大范围内)。
490
491当用户取消选择所有项目、按“返回”按钮或选择操作栏左侧的“完成”操作时,该操作模式将会禁用,且上下文操作栏将会消失。
492
493<em></em></p>
494
495<p class="note"><strong>注:</strong>上下文操作栏不一定与<a href="{@docRoot}guide/topics/ui/actionbar.html">操作栏</a>相关联。
496尽管表面上看来上下文操作栏取代了操作栏的位置,但事实上二者独立运行。
497
498</p>
499
500<p>如果您的应用是针对
501Android 3.0(API 级别 11)或更高版本的系统而开发,则通常应使用上下文操作模式(而不是<a href="#FloatingContextMenu">浮动上下文菜单</a>)显示上下文操作。</p>
502
503<p>对于提供上下文操作的视图,当出现以下两个事件(或之一)时,您通常应调用上下文操作模式:
504</p>
505<ul>
506  <li>用户长按视图。</li>
507  <li>用户选中复选框或视图内的类似 UI 组件。</li>
508</ul>
509
510<p>应用如何调用上下文操作模式以及如何定义每个操作的行为,具体取决于您的设计。
511设计基本上分为两种:</p>
512<ul>
513  <li>针对单个任意视图的上下文操作。</li>
514  <li>针对 {@link
515android.widget.ListView} 或 {@link android.widget.GridView}
516中项目组的批处理上下文操作(允许用户选择多个项目并针对所有项目执行操作)。</li>
517</ul>
518
519<p>下文介绍每种场景所需的设置。</p>
520
521
522<h4 id="CABforViews">为单个视图启用上下文操作模式</h4>
523
524<p>如果希望仅当用户选择特定视图时才调用上下文操作模式,则应:
525</p>
526<ol>
527  <li>实现 {@link android.view.ActionMode.Callback} 接口。在其回调方法中,您既可以为上下文操作栏指定操作,又可以响应操作项目的点击事件,还可以处理操作模式的其他生命周期事件。
528
529</li>
530  <li>当需要显示操作栏时(例如,用户长按视图),请调用
531{@link android.app.Activity#startActionMode startActionMode()}。</li>
532</ol>
533
534<p>例如:</p>
535
536<ol>
537  <li>实现 {@link android.view.ActionMode.Callback ActionMode.Callback} 接口:
538<pre>
539private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
540
541    // Called when the action mode is created; startActionMode() was called
542    &#64;Override
543    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
544        // Inflate a menu resource providing context menu items
545        MenuInflater inflater = mode.getMenuInflater();
546        inflater.inflate(R.menu.context_menu, menu);
547        return true;
548    }
549
550    // Called each time the action mode is shown. Always called after onCreateActionMode, but
551    // may be called multiple times if the mode is invalidated.
552    &#64;Override
553    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
554        return false; // Return false if nothing is done
555    }
556
557    // Called when the user selects a contextual menu item
558    &#64;Override
559    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
560        switch (item.getItemId()) {
561            case R.id.menu_share:
562                shareCurrentItem();
563                mode.finish(); // Action picked, so close the CAB
564                return true;
565            default:
566                return false;
567        }
568    }
569
570    // Called when the user exits the action mode
571    &#64;Override
572    public void onDestroyActionMode(ActionMode mode) {
573        mActionMode = null;
574    }
575};
576</pre>
577
578<p>请注意,这些事件回调与<a href="#options-menu">选项菜单</a>的回调几乎完全相同,只是其中每个回调还会传递与事件相关联的 {@link
579android.view.ActionMode} 对象。您可以使用
580{@link
581android.view.ActionMode} API 对 CAB 进行各种更改,例如:使用 {@link android.view.ActionMode#setTitle setTitle()}
582和 {@link
583android.view.ActionMode#setSubtitle setSubtitle()}(这对指示要选择多少个项目非常有用)修改标题和副标题。</p>
584
585<p>另请注意,操作模式被销毁时,上述示例会将 {@code mActionMode}
586变量设置为 null。在下一步中,您将了解如何初始化该变量,以及保存 Activity 或片段中的成员变量有何作用。
587</p>
588</li>
589
590  <li>调用 {@link android.app.Activity#startActionMode startActionMode()}
591以便适时启用上下文操作模式,例如:响应对 {@link
592android.view.View} 的长按操作:</p>
593
594<pre>
595someView.setOnLongClickListener(new View.OnLongClickListener() {
596    // Called when the user long-clicks on someView
597    public boolean onLongClick(View view) {
598        if (mActionMode != null) {
599            return false;
600        }
601
602        // Start the CAB using the ActionMode.Callback defined above
603        mActionMode = getActivity().startActionMode(mActionModeCallback);
604        view.setSelected(true);
605        return true;
606    }
607});
608</pre>
609
610<p>当您调用 {@link android.app.Activity#startActionMode startActionMode()} 时,系统将返回已创建的
611{@link android.view.ActionMode}。通过将其保存在成员变量中,您可以更改上下文操作栏来响应其他事件。
612在上述示例中,
613{@link android.view.ActionMode}
614用于在启动操作模式之前检查成员是否为空,以确保当 {@link android.view.ActionMode}
615实例已激活时不再重建该实例。</p>
616</li>
617</ol>
618
619
620
621<h4 id="CABforListView">在 ListView 或 GridView 中启用批处理上下文操作</h4>
622
623<p>如果您在 {@link android.widget.ListView} 或 {@link
624android.widget.GridView} 中有一组项目(或 {@link android.widget.AbsListView}
625的其他扩展),且需要允许用户执行批处理操作,则应:</p>
626
627<ul>
628  <li>实现
629{@link android.widget.AbsListView.MultiChoiceModeListener} 接口,并使用 {@link android.widget.AbsListView#setMultiChoiceModeListener
630setMultiChoiceModeListener()} 为视图组设置该接口。在侦听器的回调方法中,您既可以为上下文操作栏指定操作,也可以响应操作项目的点击事件,还可以处理从
631{@link android.view.ActionMode.Callback}
632接口继承的其他回调。</li>
633
634  <li>使用 {@link
635android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL} 参数调用 {@link android.widget.AbsListView#setChoiceMode setChoiceMode()}。</li>
636</ul>
637
638<p>例如:</p>
639
640<pre>
641ListView listView = getListView();
642listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
643listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
644
645    &#64;Override
646    public void onItemCheckedStateChanged(ActionMode mode, int position,
647                                          long id, boolean checked) {
648        // Here you can do something when items are selected/de-selected,
649        // such as update the title in the CAB
650    }
651
652    &#64;Override
653    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
654        // Respond to clicks on the actions in the CAB
655        switch (item.getItemId()) {
656            case R.id.menu_delete:
657                deleteSelectedItems();
658                mode.finish(); // Action picked, so close the CAB
659                return true;
660            default:
661                return false;
662        }
663    }
664
665    &#64;Override
666    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
667        // Inflate the menu for the CAB
668        MenuInflater inflater = mode.getMenuInflater();
669        inflater.inflate(R.menu.context, menu);
670        return true;
671    }
672
673    &#64;Override
674    public void onDestroyActionMode(ActionMode mode) {
675        // Here you can make any necessary updates to the activity when
676        // the CAB is removed. By default, selected items are deselected/unchecked.
677    }
678
679    &#64;Override
680    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
681        // Here you can perform updates to the CAB due to
682        // an {@link android.view.ActionMode#invalidate} request
683        return false;
684    }
685});
686</pre>
687
688<p>就这么简单。现在,当用户通过长按选择项目时,系统即会调用 {@link
689android.widget.AbsListView.MultiChoiceModeListener#onCreateActionMode onCreateActionMode()}
690方法,并显示包含指定操作的上下文操作栏。当上下文操作栏可见时,用户可以选择其他项目。
691</p>
692
693<p>在某些情况下,如果上下文操作提供常用的操作项目,则您可能需要添加一个复选框或类似的
694UI
695元素来支持用户选择项目,这是因为他们可能没有发现长按行为。用户选中该复选框时,您可以通过使用
696{@link android.widget.AbsListView#setItemChecked setItemChecked()}
697将相应的列表项设置为选中状态,以此调用上下文操作模式。</p>
698
699
700
701
702<h2 id="PopupMenu">创建弹出菜单</h2>
703
704<div class="figure" style="width:220px">
705<img src="{@docRoot}images/ui/popupmenu.png" alt="" />
706<p><strong>图 4. </strong>Gmail 应用中的弹出菜单,锚定到右上角的溢出按钮。
707</p>
708</div>
709
710<p>{@link android.widget.PopupMenu}
711是锚定到 {@link android.view.View} 的模态菜单。如果空间足够,它将显示在定位视图下方,否则显示在其上方。它适用于:</p>
712<ul>
713  <li>为与特定内容确切相关的操作提供溢出样式菜单(例如,Gmail
714的电子邮件标头,如图 4 所示)。<em></em>
715    <p class="note"><strong>注:</strong>这与上下文菜单不同,后者通常用于影响所选内容的操作。
716<em></em>对于影响所选内容的操作,请使用<a href="#CAB">上下文操作模式</a>或<a href="#FloatingContextMenu">浮动上下文菜单</a>。
717</p></li>
718  <li>提供命令语句的另一部分(例如,标记为“添加”且使用不同的“添加”选项生成弹出菜单的按钮)。
719</li>
720  <li>提供类似于
721{@link android.widget.Spinner} 且不保留永久选择的下拉菜单。</li>
722</ul>
723
724
725<p class="note"><strong>注:</strong>{@link android.widget.PopupMenu} 在 API
726级别 11 及更高版本中可用。</p>
727
728<p>如果<a href="#xml">使用 XML 定义菜单</a>,则显示弹出菜单的方法如下:</p>
729<ol>
730  <li>实例化
731{@link android.widget.PopupMenu} 及其构造函数,该函数将提取当前应用的 {@link android.content.Context} 以及菜单应锚定到的
732{@link android.view.View}。</li>
733  <li>使用 {@link android.view.MenuInflater} 将菜单资源扩充到 {@link
734android.widget.PopupMenu#getMenu() PopupMenu.getMenu()} 返回的 {@link
735android.view.Menu} 对象中。在 API 级别 14 及更高版本中,您可以改为使用
736{@link android.widget.PopupMenu#inflate PopupMenu.inflate()}。</li>
737  <li>调用 {@link android.widget.PopupMenu#show() PopupMenu.show()}。</li>
738</ol>
739
740<p>例如,以下是一个使用
741{@link android.R.attr#onClick android:onClick} 属性显示弹出菜单的按钮:</p>
742
743<pre>
744&lt;ImageButton
745    android:layout_width="wrap_content"
746    android:layout_height="wrap_content"
747    android:src="@drawable/ic_overflow_holo_dark"
748    android:contentDescription="@string/descr_overflow_button"
749    android:onClick="showPopup" />
750</pre>
751
752<p>稍后,Activity 可按照如下方式显示弹出菜单:</p>
753
754<pre>
755public void showPopup(View v) {
756    PopupMenu popup = new PopupMenu(this, v);
757    MenuInflater inflater = popup.getMenuInflater();
758    inflater.inflate(R.menu.actions, popup.getMenu());
759    popup.show();
760}
761</pre>
762
763<p>在 API 级别 14 及更高版本中,您可以将两行合在一起,使用 {@link
764android.widget.PopupMenu#inflate PopupMenu.inflate()} 扩充菜单。</p>
765
766<p>当用户选择项目或触摸菜单以外的区域时,系统即会清除此菜单。
767您可使用 {@link
768android.widget.PopupMenu.OnDismissListener} 侦听清除事件。</p>
769
770<h3 id="PopupEvents">处理点击事件</h3>
771
772<p>要在用户选择菜单项时执行操作,您必须实现
773{@link
774android.widget.PopupMenu.OnMenuItemClickListener} 接口,并通过调用 {@link android.widget.PopupMenu#setOnMenuItemClickListener
775setOnMenuItemclickListener()} 将其注册到 {@link
776android.widget.PopupMenu}。用户选择项目时,系统会在接口中调用 {@link
777android.widget.PopupMenu.OnMenuItemClickListener#onMenuItemClick onMenuItemClick()}
778回调。</p>
779
780<p>例如:</p>
781
782<pre>
783public void showMenu(View v) {
784    PopupMenu popup = new PopupMenu(this, v);
785
786    // This activity implements OnMenuItemClickListener
787    popup.setOnMenuItemClickListener(this);
788    popup.inflate(R.menu.actions);
789    popup.show();
790}
791
792&#64;Override
793public boolean onMenuItemClick(MenuItem item) {
794    switch (item.getItemId()) {
795        case R.id.archive:
796            archive(item);
797            return true;
798        case R.id.delete:
799            delete(item);
800            return true;
801        default:
802            return false;
803    }
804}
805</pre>
806
807
808<h2 id="groups">创建菜单组</h2>
809
810<p>菜单组是指一系列具有某些共同特征的菜单项。通过菜单组,您可以:
811</p>
812<ul>
813  <li>使用 {@link android.view.Menu#setGroupVisible(int,boolean)
814setGroupVisible()} 显示或隐藏所有项目</li>
815  <li>使用 {@link android.view.Menu#setGroupEnabled(int,boolean)
816setGroupEnabled()} 启用或禁用所有项目</li>
817  <li>使用 {@link
818android.view.Menu#setGroupCheckable(int,boolean,boolean) setGroupCheckable()} 指定所有项目是否可选中</li>
819</ul>
820
821<p>通过将 {@code &lt;item&gt;} 元素嵌套在菜单资源中的 {@code &lt;group&gt;}
822元素内,或者通过使用 {@link
823android.view.Menu#add(int,int,int,int) add()} 方法指定组 ID,您可以创建组。</p>
824
825<p>以下是包含组的菜单资源示例:</p>
826
827<pre>
828&lt;?xml version="1.0" encoding="utf-8"?&gt;
829&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
830    &lt;item android:id="@+id/menu_save"
831          android:icon="@drawable/menu_save"
832          android:title="@string/menu_save" /&gt;
833    &lt;!-- menu group --&gt;
834    &lt;group android:id="@+id/group_delete"&gt;
835        &lt;item android:id="@+id/menu_archive"
836              android:title="@string/menu_archive" /&gt;
837        &lt;item android:id="@+id/menu_delete"
838              android:title="@string/menu_delete" /&gt;
839    &lt;/group&gt;
840&lt;/menu&gt;
841</pre>
842
843<p>组中的项目出现在与第一项相同的级别,即:菜单中的所有三项均为同级。
844但是,您可以通过引用组 ID
845并使用上面列出的方法,修改组中两项的特征。此外,系统也绝不会分离已分组的项目。
846例如,如果为每个项目声明
847{@code
848android:showAsAction="ifRoom"},则它们会同时显示在操作栏或操作溢出菜单中。</p>
849
850
851<h3 id="checkable">使用可选中的菜单项</h3>
852
853<div class="figure" style="width:200px">
854  <img src="{@docRoot}images/radio_buttons.png" height="333" alt="" />
855  <p class="img-caption"><strong>图 5. </strong>含可选中项目的子菜单的屏幕截图。
856</p>
857</div>
858
859<p>作为启用/禁用选项的接口,菜单非常实用,既可针对独立选项使用复选框,也可针对互斥选项组使用单选按钮。
860
861图 5 显示了一个子菜单,其中的项目可使用单选按钮选中。
862</p>
863
864<p class="note"><strong>注:</strong>“图标菜单”(在选项菜单中)的菜单项无法显示复选框或单选按钮。
865如果您选择使“图标菜单”中的项目可选中,则必须在选中状态每次发生变化时交换图标和/或文本,手动指出该状态。
866
867</p>
868
869<p>您可以使用 {@code &lt;item&gt;} 元素中的 {@code
870android:checkable} 属性为各个菜单项定义可选中的行为,或者使用 {@code &lt;group&gt;} 元素中的
871{@code android:checkableBehavior} 属性为整个组定义可选中的行为。例如,此菜单组中的所有项目均可使用单选按钮选中:
872</p>
873
874<pre>
875&lt;?xml version="1.0" encoding="utf-8"?&gt;
876&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
877    &lt;group android:checkableBehavior="single"&gt;
878        &lt;item android:id="@+id/red"
879              android:title="@string/red" /&gt;
880        &lt;item android:id="@+id/blue"
881              android:title="@string/blue" /&gt;
882    &lt;/group&gt;
883&lt;/menu&gt;
884</pre>
885
886<p>{@code android:checkableBehavior} 属性接受以下任一选项:
887<dl>
888  <dt>{@code single}</dt>
889    <dd>组中只有一个项目可以选中(单选按钮)</dd>
890  <dt>{@code all}</dt>
891    <dd>所有项目均可选中(复选框)</dd>
892  <dt>{@code none}</dt>
893    <dd>所有项目均无法选中</dd>
894</dl>
895
896<p>您可以使用 {@code &lt;item&gt;}
897元素中的 {@code android:checked} 属性将默认的选中状态应用于项目,并可使用 {@link
898android.view.MenuItem#setChecked(boolean) setChecked()} 方法在代码中更改此默认状态。</p>
899
900<p>选择可选中项目后,系统将调用所选项目的相应回调方法(例如,{@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()})。
901此时,您必须设置复选框的状态,因为复选框或单选按钮不会自动更改其状态。
902
903您可以使用 {@link android.view.MenuItem#isChecked()}
904查询项目的当前状态(正如用户选择该项目之前一样),然后使用
905{@link android.view.MenuItem#setChecked(boolean) setChecked()} 设置选中状态。例如:</p>
906
907<pre>
908&#64;Override
909public boolean onOptionsItemSelected(MenuItem item) {
910    switch (item.getItemId()) {
911        case R.id.vibrate:
912        case R.id.dont_vibrate:
913            if (item.isChecked()) item.setChecked(false);
914            else item.setChecked(true);
915            return true;
916        default:
917            return super.onOptionsItemSelected(item);
918    }
919}
920</pre>
921
922<p>如果未通过这种方式设置选中状态,则项目的可见状态(复选框或单选按钮)不会因为用户选择它而发生变化。
923
924如果已设置该状态,则 Activity 会保留项目的选中状态。这样一来,当用户稍后打开菜单时,您设置的选中状态将会可见。
925
926</p>
927
928<p class="note"><strong>注:</strong>可选中菜单项的使用往往因会话而异,且在应用销毁后不予保存。
929
930如果您想为用户保存某些应用设置,则应使用<a href="{@docRoot}guide/topics/data/data-storage.html#pref">共享首选项</a>存储数据。
931</p>
932
933
934
935<h2 id="intents">添加基于 Intent 的菜单项</h2>
936
937<p>有时,您希望菜单项通过使用
938{@link android.content.Intent} 启动 Activity(无论该 Activity 是位于您的应用还是其他应用中)。如果您知道自己要使用的 Intent,且具有启动 Intent 的特定菜单项,则可在相应的
939on-item-selected 回调方法(例如,{@link
940android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} 回调)期间使用
941{@link android.app.Activity#startActivity(Intent) startActivity()}
942执行 Intent。</p>
943
944<p>但是,如果不确定用户的设备是否包含可处理 Intent 的应用,则添加调用 Intent 的菜单项可能会导致该菜单项无法正常工作,这是因为 Intent 可能无法解析为 Activity。
945
946
947为了解决这一问题,当
948Android 在设备上找到可处理 Intent 的 Activity 时,则允许您向菜单动态添加菜单项。</p>
949
950<p>要根据接受 Intent 的可用 Activity 添加菜单项,请执行以下操作:</p>
951<ol>
952  <li>使用类别
953{@link android.content.Intent#CATEGORY_ALTERNATIVE} 和/或
954{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} 以及任何其他要求定义 Intent。</li>
955  <li>调用 {@link
956android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
957Menu.addIntentOptions()}。Android
958随后即会搜索能够执行 Intent 的所有应用,并将其添加到菜单中。</li>
959</ol>
960
961<p>如果未安装可处理 Intent 的应用,则不会添加任何菜单项。
962</p>
963
964<p class="note"><strong>注:</strong>
965{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE}
966用于处理屏幕上当前所选的元素。因此,只有在 {@link
967android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo)
968onCreateContextMenu()} 中创建菜单时,才能使用它。</p>
969
970<p>例如:</p>
971
972<pre>
973&#64;Override
974public boolean onCreateOptionsMenu(Menu menu){
975    super.onCreateOptionsMenu(menu);
976
977    // Create an Intent that describes the requirements to fulfill, to be included
978    // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
979    Intent intent = new Intent(null, dataUri);
980    intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
981
982    // Search and populate the menu with acceptable offering applications.
983    menu.addIntentOptions(
984         R.id.intent_group,  // Menu group to which new items will be added
985         0,      // Unique item ID (none)
986         0,      // Order for the items (none)
987         this.getComponentName(),   // The current activity name
988         null,   // Specific items to place first (none)
989         intent, // Intent created above that describes our requirements
990         0,      // Additional flags to control items (none)
991         null);  // Array of MenuItems that correlate to specific items (none)
992
993    return true;
994}</pre>
995
996<p>如果发现 Activity 提供的 Intent 过滤器与定义的 Intent 匹配,则会添加菜单项,并使用 Intent 过滤器
997<code>android:label</code>
998中的值作为菜单项标题,使用应用图标作为菜单项图标。{@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
999addIntentOptions()}
1000方法将返回已添加的菜单项数量。</p>
1001
1002<p class="note"><strong>注:</strong>调用
1003{@link
1004android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
1005addIntentOptions()} 方法时,它将使用第一个参数中指定的菜单组替代所有菜单项。</p>
1006
1007
1008<h3 id="AllowingToAdd">允许将 Activity 添加到其他菜单中</h3>
1009
1010<p>此外,您还可以为其他应用提供您的 Activity 服务,以便您的应用能够包含在其他应用的菜单中(与上述角色相反)。
1011</p>
1012
1013<p>要包含在其他应用菜单中,您需要按常规方式定义 Intent 过滤器,但请确保为 Intent 过滤器类别添加
1014{@link android.content.Intent#CATEGORY_ALTERNATIVE}
1015和/或 {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE}
1016值。例如:</p>
1017<pre>
1018&lt;intent-filter label="&#64;string/resize_image">
1019    ...
1020    &lt;category android:name="android.intent.category.ALTERNATIVE" />
1021    &lt;category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
1022    ...
1023&lt;/intent-filter>
1024</pre>
1025
1026<p>请仔细阅读<a href="/guide/components/intents-filters.html"> Intent 和 Intent 过滤器</a>文档中更多有关编写 Intent 过滤器的内容。
1027</p>
1028
1029<p>有关使用此方法的应用示例,请参阅<a href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">记事本</a>示例代码。
1030
1031</p>
1032