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><menu></code></dt> 131 <dd>定义 {@link android.view.Menu},即菜单项的容器。<code><menu></code> 132元素必须是该文件的根节点,并且能够包含一个或多个 133<code><item></code> 和 <code><group></code> 元素。</dd> 134 135 <dt><code><item></code></dt> 136 <dd>创建 {@link android.view.MenuItem},此元素表示菜单中的一项,可能包含嵌套的 <code><menu></code> 137元素,以便创建子菜单。</dd> 138 139 <dt><code><group></code></dt> 140 <dd>{@code <item>} 元素的不可见容器(可选)。它支持您对菜单项进行分类,使其共享活动状态和可见性等属性。 141如需了解详细信息,请参阅<a href="#groups">创建菜单组</a>部分。 142</dd> 143</dl> 144 145 146<p>以下是名为 <code>game_menu.xml</code> 的菜单示例:</p> 147<pre> 148<?xml version="1.0" encoding="utf-8"?> 149<menu xmlns:android="http://schemas.android.com/apk/res/android"> 150 <item android:id="@+id/new_game" 151 android:icon="@drawable/ic_new_game" 152 android:title="@string/new_game" 153 android:showAsAction="ifRoom"/> 154 <item android:id="@+id/help" 155 android:icon="@drawable/ic_help" 156 android:title="@string/help" /> 157</menu> 158</pre> 159 160<p><code><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 <item>} 179子元素的形式添加 {@code <menu>} 元素,向任何菜单(子菜单除外)中的某个菜单项添加子菜单。当应用具有大量可按主题进行组织的功能时,类似于 PC 应用程序菜单栏中的菜单项(“文件”、“编辑”、“视图”等),子菜单非常有用。 180 181例如:</p> 182 183<pre> 184<?xml version="1.0" encoding="utf-8"?> 185<menu xmlns:android="http://schemas.android.com/apk/res/android"> 186 <item android:id="@+id/file" 187 android:title="@string/file" > 188 <!-- "file" submenu --> 189 <menu> 190 <item android:id="@+id/create_new" 191 android:title="@string/create_new" /> 192 <item android:id="@+id/open" 193 android:title="@string/open" /> 194 </menu> 195 </item> 196</menu> 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 <item>} 元素,从而将几个项目提升到操作栏中(请参阅图 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 <item>} 中的菜单项重新排序。</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@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@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@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@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 @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 @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 @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 @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 @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 @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 @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 @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 @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<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@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 <item>} 元素嵌套在菜单资源中的 {@code <group>} 822元素内,或者通过使用 {@link 823android.view.Menu#add(int,int,int,int) add()} 方法指定组 ID,您可以创建组。</p> 824 825<p>以下是包含组的菜单资源示例:</p> 826 827<pre> 828<?xml version="1.0" encoding="utf-8"?> 829<menu xmlns:android="http://schemas.android.com/apk/res/android"> 830 <item android:id="@+id/menu_save" 831 android:icon="@drawable/menu_save" 832 android:title="@string/menu_save" /> 833 <!-- menu group --> 834 <group android:id="@+id/group_delete"> 835 <item android:id="@+id/menu_archive" 836 android:title="@string/menu_archive" /> 837 <item android:id="@+id/menu_delete" 838 android:title="@string/menu_delete" /> 839 </group> 840</menu> 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 <item>} 元素中的 {@code 870android:checkable} 属性为各个菜单项定义可选中的行为,或者使用 {@code <group>} 元素中的 871{@code android:checkableBehavior} 属性为整个组定义可选中的行为。例如,此菜单组中的所有项目均可使用单选按钮选中: 872</p> 873 874<pre> 875<?xml version="1.0" encoding="utf-8"?> 876<menu xmlns:android="http://schemas.android.com/apk/res/android"> 877 <group android:checkableBehavior="single"> 878 <item android:id="@+id/red" 879 android:title="@string/red" /> 880 <item android:id="@+id/blue" 881 android:title="@string/blue" /> 882 </group> 883</menu> 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 <item>} 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@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@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<intent-filter label="@string/resize_image"> 1019 ... 1020 <category android:name="android.intent.category.ALTERNATIVE" /> 1021 <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> 1022 ... 1023</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