• 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">根據意圖新增選單項目</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">和選單按鈕說再見
53</a></li>
54  </ol>
55</div>
56</div>
57
58<p>選單在許多類型的應用程式中都是常見的使用者介面元件。為提供熟悉且一致的使用者體驗,您應該使用
59{@link android.view.Menu} API 來呈現 Activity 中的使用者動作與其他選項。
60</p>
61
62<p>從 Android 3.0 (API 級別 11) 開始,提供 Android 的裝置不再需要提供專屬的「選單」<em></em>按鈕。
63有此變更之後,Android 應用程式應可脫離對傳統有 6 個項目的選單面板的依賴,改為提供動作列來呈現一般的使用者動作。
64
65</p>
66
67<p>雖然有些選單項目的設計與使用者體驗有所變更,但依然是根據
68{@link android.view.Menu} API 來定義一組動作與選項的語意。本指南說明如何在所有版本的 Android 上,建立三個基本類型的選單或動作呈現方式:
69
70</p>
71
72<dl>
73  <dt><strong>選項選單和動作列</strong></dt>
74    <dd><a href="#options-menu">選項選單</a>是 Activity 的主要選單項目集合。
75您應該將對應用程式有全域影響的動作放置在此,例如「搜尋」、「撰寫電子郵件」及「設定」。
76
77  <p>如果您是為 Android 2.3 以下版本進行開發,使用者可按下「選單」<em></em>按鈕來顯示選項選單面板。
78</p>
79  <p>在 Android 3.0 以上版本,選項選單的項目是當成螢幕上的動作項目與溢出選項組合,以<a href="{@docRoot}guide/topics/ui/actionbar.html">動作列</a>呈現。
80從 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 提供標準 XML 格式來定義選單項目。
114您應該在 XML <a href="{@docRoot}guide/topics/resources/menu-resource.html">選單資源</a>中定義選單與其相關項目,而不是在您 Activity 的程式碼中建置選單。
115接著,您可以擴大 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> 目錄內建立 XML 檔案,然後利用下列元素建置選單:
128</p>
129<dl>
130  <dt><code>&lt;menu></code></dt>
131    <dd>定義選單項目的容器 {@link android.view.Menu}。<code>&lt;menu></code> 元素必須是檔案的根節點,並可保留一或多個
132<code>&lt;item></code> 與 <code>&lt;group></code> 元素。
133</dd>
134
135  <dt><code>&lt;item></code></dt>
136    <dd>建立代表選單中單一項目的 {@link android.view.MenuItem}。此元素可以包含巢狀
137<code>&lt;menu></code> 元素以建立子選單。</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>項目獨有的資源 ID,當使用者選取該項目時可讓應用程式辨識出來。
166</dd>
167  <dt>{@code android:icon}</dt>
168    <dd>要當成項目圖示使用的可繪項目參考資料。</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>這些都是您應該使用的最重要屬性,但不侷限於上述這幾個。
176如需所有支援屬性的詳細資訊,請參閱<a href="{@docRoot}guide/topics/resources/menu-resource.html">選單資源</a>。</p>
177
178<p>您可以藉由將 {@code &lt;menu&gt;} 元素新增為 {@code &lt;item&gt;} 的子項,將子選單新增至任何選單 (子選單除外) 的項目。
179當您的應用程式有很多可按主題分類的功能,例如 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>選項選單中的項目會顯示在螢幕上的哪個位置,取決於您為其開發應用程式的版本。
218</p>
219
220<ul>
221  <li>如果您為「Android 2.3.x (API 級別 10) 以下版本」<strong></strong>開發應用程式,當使用者按下[選單]<em></em> 按鈕,選項選單的內容會顯示在螢幕底部,如圖 1 所示。
222
223開啟時,第一個可見部分就是最多可保留六個選單項目的圖示選單。
224
225如果您的選單包含六個以上的項目,Android 會將第六個與其餘的項目放入溢出選單,使用者可透過選取[更多]<em></em> 來開啟。
226
227</li>
228
229  <li>如果您為「Android 3.0 (API 級別 11) 以上版本」<strong></strong>開發應用程式,選項選單中的項目會顯示在<a href="{@docRoot}guide/topics/ui/actionbar.html">動作列</a>。
230在預設情況下,系統會將所有項目放入動作溢出,使用者可以利用動作列右側的動作溢出圖示來顯示 (或按裝置的「選單」<em></em>按鈕,如果有的話)。
231
232為了能夠快速存取重要的動作,您可以將 {@code android:showAsAction="ifRoom"} 新增至對應的 {@code &lt;item&gt;} 元素,將要顯示在動作列的幾個項目升階 (請參閱圖 2)。
233
234
235
236 <p>如需動作項目與其他動作列行為的詳細資訊,請參閱<a href="{@docRoot}guide/topics/ui/actionbar.html">動作列</a>指南。 </p>
237<p class="note"><strong>注意:</strong>即使您「並非」<em></em>為 Android 3.0 以上版本進行開發,您仍可建置自己的動作列版面配置,達到類似的效果。
238如需如何支援舊版Android 提供動作列的範例,請參閱<a href="{@docRoot}resources/samples/ActionBarCompat/index.html">動作列相容性</a>範例。
239
240</p>
241</li>
242</ul>
243
244<img src="{@docRoot}images/ui/actionbar.png" alt="" />
245<p class="img-caption"><strong>圖 2.</strong><a href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb 圖片庫</a>應用程式的動作列,顯示導覽索引標籤與相機動作項目 (再加上動作溢出按鈕)。
246</p>
247
248<p>您可以從 {@link android.app.Activity} 子類別或 {@link android.app.Fragment} 子類別宣告選項選單的項目。
249如果您的 Activity 與片段都宣告選項選單的項目,兩者會在 UI 中結合。
250
251先顯示 Activity 的項目,接著會依片段新增至 Activity 的順序顯示各片段的項目。
252您可以視需要在您想移動的 {@code &lt;item&gt;} 中,利用其 {@code android:orderInCategory}屬性重新排列選單項目的順序。
253</p>
254
255<p>如要指定 Activity 的選項選單,可覆寫 {@link
256android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} (片段會提供自己的
257{@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()} 回呼)。在這種方法中,您可以將選單資源(<a href="#xml">在 XML 中完成定義</a>) 擴大回呼中提供的 {@link
258android.view.Menu}。
259例如:</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.MenuItem} API,您也可以使用 {@link android.view.Menu#add(int,int,int,int)
271add()} 來新增選單項目,以及利用 {@link android.view.Menu#findItem findItem()} 擷取項目來修訂它們的屬性。
272</p>
273
274<p>如果您是為 Android 2.3.x 以下版本開發應用程式,當使用者初次開啟選單時,系統會呼叫 {@link
275android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()},以建立選項選單。
276如果您是為 Android 3.0 以上版本開發應用程式,啟動 Activity 時,系統會呼叫
277{@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()},以在動作列顯示項目。
278</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 (由選單資源中的
288{@code android:id} 屬性或透過指定給
289{@link android.view.Menu#add(int,int,int,int) add()} 方法的整數來定義) 來識別該項目。您可以將此 ID 和已知選單項目比對,以執行適當動作。
290例如:</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}。如果您不處理選單項目,應該呼叫
310{@link
311android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} 的超級類別實作 (預設實作會傳回 false)。
312</p>
313
314<p>如果您的 Activity 包含片段,系統會先呼叫 Activity 的 {@link
315android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()},再依片段的新增順序呼叫各片段,直到其中之一傳回
316{@code true} 或所有片段均已呼叫。
317</p>
318
319<p class="note"><strong>提示:</strong>Android 3.0 新增的功能可讓您在 XML 中使用
320{@code android:onClick} 屬性定義選單項目的點擊行為。該屬性值必須是使用選單的 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 且有一些提供相同的選項選單,可考慮建立只實作
326{@link android.app.Activity#onCreateOptionsMenu(Menu)
327onCreateOptionsMenu()} 與 {@link android.app.Activity#onOptionsItemSelected(MenuItem)
328onOptionsItemSelected()} 方法的 Activity。
329接著,針對應共用相同選項選單的 Activity 擴充此類別。
330如此一來,您可以管理一組處理選單動作的程式碼,以及每一個繼承選單行為的子系類別。
331
332
333如果您想要將選單項目新增至其中一個子系 Activity,請覆寫該 Activity 中的 {@link android.app.Activity#onCreateOptionsMenu(Menu)
334onCreateOptionsMenu()}。呼叫 {@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>系統呼叫 {@link android.app.Activity#onCreateOptionsMenu(Menu)
343onCreateOptionsMenu()} 之後,會保留您填入的 {@link android.view.Menu} 執行個體,除非該選單因某種理由而變無效,否則不會再次呼叫
344{@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}。
345不過,{@link
346android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} 應該只用來建立初始選單狀態,您不要在 Activity 生命週期間用來進行變更。
347</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>在 Android 2.3.x 以下版本,每當使用者開啟選項選單 (按下 [選單]<em></em>
357按鈕) 時,系統都會呼叫 {@link
358android.app.Activity#onPrepareOptionsMenu(Menu)
359onPrepareOptionsMenu()}。</p>
360
361<p>在 Android 3.0 以上版本,當選單項目顯示在動作列時會一律將選項選單視為開啟。
362當事件發生且您想要執行選單更新時,您必須呼叫
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
386您可以為任何檢視提供內容選單,但它們通常用於使用者能直接對各項目執行動作的 {@link
387android.widget.ListView}、{@link android.widget.GridView} 或其他檢視集合中的項目。</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} 的系統實作,在畫面頂端將會影響將所選項目的動作項目顯示在「內容關聯動作列」<em></em>。
398此模式處於使用中時,使用者能一次對多個項目執行某一動作 (如果您的應用程式允許的話)。
399</li>
400</ul>
401
402<p class="note"><strong>注意:</strong>Android 3.0 (API 級別 11) 以上版本可以使用內容關聯動作模式,此模式同時是可以顯示內容關聯動作時的偏好技術。
403
404如果您的應用程式支援 3.0 以下版本,您應該在這類裝置上切換為浮動內容選單。
405</p>
406
407
408<h3 id="FloatingContextMenu">建立浮動內容選單</h3>
409
410<p>如何提供浮動內容選單:</p>
411<ol>
412  <li>呼叫 {@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()} 並將 {@link android.view.View} 傳送給它,向應該建立關聯的內容選單註冊 {@link android.view.View}。
413
414
415  <p>如果您的 Activity 使用 {@link android.widget.ListView} 或 {@link android.widget.GridView},且您希望每個項目都提供相同的內容選單,可將 {@link android.widget.ListView} 或 {@link android.widget.GridView} 傳送至 {@link
416android.app.Activity#registerForContextMenu(View) registerForContextMenu()} 來註冊內容選單的所有項目。
417
418</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},以及提供其他所選取項目相關資訊的 {@link android.view.ContextMenu.ContextMenuInfo} 物件。
440
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()} 方法會查詢選定選單項目的 ID,使用
469{@code
470android:id} 屬性在 XML 中指派給各個選單項目,如<a href="#xml">在 XML 中定義選單</a>一節所述。
471</p>
472
473<p>當您成功處理選單項目時會傳回 {@code true}。如果您不處理選單項目,請將選單項目傳送至超級類別實作。
474如果您的 Activity 包括片段,該 Activity 會先收到此回呼。
475在不處理時呼叫超級類別,系統就可以一次一個 (依片段的新增順序) 將事件傳送至各片段中的個別回呼方法,直到傳回
476{@code true} 或 {@code false}。
477(
478{@link android.app.Activity} 與 {@code android.app.Fragment} 的預設實作會傳回 {@code
479false},因此當您不處理時,務必要呼叫超級類別。)</p>
480</li>
481</ol>
482
483
484<h3 id="CAB">使用內容關聯動作模式</h3>
485
486<p>內容關聯動作模式是 {@link android.view.ActionMode} 的系統實作,執行內容關聯動作時著重於與使用者互動。
487當使用者選取項目而啟用此模式時,「內容關聯動作列」<em></em>會出現在畫面頂端,呈現使用者可在目前所選項目上執行的動作。
488
489此模式啟用時,使用者能選取多個項目 (如果您允許的話)、取消選取項目,還可以在 Activity 內繼續瀏覽 (在您允許的範圍內)。
490
491當使用者取消選取所有項目、按下 [後退] 按鈕,或選取該列左側的[完成]<em></em> 按鈕時,動作模式會停用且內容 關聯 動作列也會消失。
492
493</p>
494
495<p class="note"><strong>注意:</strong>內容關聯動作列不一定要與<a href="{@docRoot}guide/topics/ui/actionbar.html">動作列</a>關聯。
496即使內容相關動作列在視覺上覆蓋動作列的位置,兩者依然獨立運作。
497
498</p>
499
500<p>如果您在為 Android 3.0 (API 級別 11) 以上版本進行開發,您應使用內容關聯動作模式來呈現內容動作,而不是<a href="#FloatingContextMenu">浮動內容選單</a>。
501</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>當您想要顯示該列時 (例如當使用者長按檢視時),可呼叫 {@link android.app.Activity#startActionMode startActionMode()}。
531</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} 物件。您可以使用 {@link
580android.view.ActionMode} API 對 CAB 進行各種變更,例如使用
581{@link android.view.ActionMode#setTitle setTitle()} 與 {@link
582android.view.ActionMode#setSubtitle setSubtitle()} 修改標題與子標題 (指出已選取的項目數量相當有用)。
583</p>
584
585<p>同時請注意,當動作模式終結時,上述範例會將 {@code mActionMode} 變數設為 null。
586在下個步驟中,您將看到它是如何初始化,以及如何儲存 Activity 或片段中的成員變數,非常實用。
587</p>
588</li>
589
590  <li>呼叫 {@link android.app.Activity#startActionMode startActionMode()} (可以的話) 以啟用內容關聯動作模式,例如回應長按 {@link
591android.view.View}。
592</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} 是用來確保不會重新建立已在使用中的 {@link android.view.ActionMode} 執行個體,方法是在將動作模式啟動之前,檢查成員是否為 null。
614
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>實作 {@link android.widget.AbsListView.MultiChoiceModeListener} 介面並使用
629{@link android.widget.AbsListView#setMultiChoiceModeListener
630setMultiChoiceModeListener()} 加以設定以供檢視群組使用。在接聽器的回呼方法中,您可以指定內容相關動作列的動作、回應動作項目的點擊事件,以及處理從 {@link android.view.ActionMode.Callback} 介面繼承的其他回呼。
631
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>在某些情況下,內容關聯動作提供一般動作項目,因為使用者可能未發現有長按行為,所以您可能希望新增核取方塊或類似的 UI 元素,讓他們選取項目。
694
695當使用者選取核取方塊時,您可以使用 {@link android.widget.AbsListView#setItemChecked setItemChecked()} 將個別的清單項目設定成已核取狀態,以呼叫內容關聯動作模式。
696
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} 是錨定於 {@link android.view.View} 的強制回應選單。
711有空間的畫會顯示在錨定檢視下方或檢視上方。適合用途:</p>
712<ul>
713  <li>為與特定內容關聯動作提供溢出樣式選單 (例如 Gmail 的電子郵件標頭,如圖 4 所示)。<em></em>
714
715    <p class="note"><strong>注意:</strong>內容選單一般用於會「影響」<em></em>所選取內容的動作,與這並不相同。
716對於會影響所選取內容的動作,請使用<a href="#CAB">內容關聯動作模式</a>或<a href="#FloatingContextMenu">浮動內容選單</a>。
717</p></li>
718  <li>提供命令句的第二部分 (例如,標示為「新增」的按鈕會產生包含不同「新增」選項的彈出式選單)。
719</li>
720  <li>提供類似於 {@link android.widget.Spinner} (不保留永續性選擇) 的下拉式清單。
721</li>
722</ul>
723
724
725<p class="note"><strong>注意:</strong> API 級別 11 以上版本才可以使用 {@link android.widget.PopupMenu}。
726</p>
727
728<p>如果您<a href="#xml">在 XML 中定義選單</a>,以下說明如何顯示彈出式選單:</p>
729<ol>
730  <li>透過其建構函式將 {@link android.widget.PopupMenu} 具現化,使用應錨定選單的目前應用程式
731{@link android.content.Context} 與 {@link android.view.View}。
732</li>
733  <li>使用 {@link android.view.MenuInflater} 將您的選單資源擴大成
734{@link
735android.widget.PopupMenu#getMenu() PopupMenu.getMenu()} 所傳回的 {@link android.view.Menu} 物件。針對 14 以上的 API 級別,您可以改用
736{@link android.widget.PopupMenu#inflate PopupMenu.inflate()}。</li>
737  <li>呼叫 {@link android.widget.PopupMenu#show() PopupMenu.show()}。</li>
738</ol>
739
740<p>例如,以下是含有 {@link android.R.attr#onClick android:onClick} 屬性可顯示彈出式選單的按鈕。
741</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>在 14 以上的 API 級別中,您可以利用 {@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>如要在使用者選取選單項目時執行動作,您必須呼叫 {@link android.widget.PopupMenu#setOnMenuItemClickListener
773setOnMenuItemclickListener()} 來實作 {@link
774android.widget.PopupMenu.OnMenuItemClickListener} 介面並向您的 {@link
775android.widget.PopupMenu} 註冊。
776當使用者選取項目時,系統會在您的介面中呼叫 {@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;}元素內,或使用 {@link
822android.view.Menu#add(int,int,int,int) add()} 方法指定群組 ID 來建立群組。
823</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例如,如果您針對每個項目宣告 {@code
847android:showAsAction="ifRoom"},它們都會顯示在動作列中或顯示在動作溢出中。
848</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;} 元素中的 {@code android:checkableBehavior} 屬性來為整個群組定義。
871例如,此選單群組中的所有項目都可以利用選項按鈕勾選。
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>您可以使用
897{@code &lt;item&gt;} 元素中的 {@code android:checked} 屬性將預設的勾選狀態套用至項目,並使用 {@link
898android.view.MenuItem#setChecked(boolean) setChecked()} 方法在程式碼中變更它。</p>
899
900<p>已選取可勾選項目時,系統會呼叫所選取個別項目的回呼方法 (例如 {@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()})。
901您必須在這裡設定核取方塊的狀態,原因是核取方塊或選項按鈕並不會自動變更其狀態。
902
903您可以利用
904{@link android.view.MenuItem#isChecked()} 來查詢項目的目前狀態 (使用者選取它之前的狀態),然後利用
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">根據意圖新增選單項目</h2>
936
937<p>有時候您會希望選單項目使用 {@link android.content.Intent}來啟動 Activity (不論是您的應用程式或另一應用程式中的 Activity)。
938當您知道想要使用的意圖,同時有應繼承該意圖的特定選單項目時,您可在使用者選取項目時才回呼的適當方法實作期間使用
939{@link android.app.Activity#startActivity(Intent) startActivity()} 執行該意圖 (例如 {@link
940android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} callback) 回呼)。
941
942</p>
943
944<p>不過,如果您不確定使用者的裝置是否包含可處理該意圖的應用程式,而新增可呼叫它的選單項目會導致選單項目無法運作,原因可能是該意圖不會解析成 Activity。
945
946
947為解決這個問題,當 Android 在處理您意圖的裝置上找到 Activity 時,Android 會讓您將選單項目動態新增至選單。
948</p>
949
950<p>如何根據接受意圖的可用 Activity 來新增選單項目:</p>
951<ol>
952  <li>定義類別為
953{@link android.content.Intent#CATEGORY_ALTERNATIVE} 和/或
954{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} 的意圖,再加上其他需求。</li>
955  <li>呼叫 {@link
956android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
957Menu.addIntentOptions()}。Android 接著會搜尋可執行該意圖的任何應用程式,並將其新增至您的選單。
958</li>
959</ol>
960
961<p>如果未安裝可滿足該意圖的應用程式,則不會新增任何選單項目。
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 提供的意圖篩選器如果與定義的意圖相符,就會新增選單項目,使用意圖篩選器的 <code>android:label</code> 中的值當成選單項目標題,並將應用程式圖示當成選單項目圖示。
997
998此外,
999{@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
1000addIntentOptions()} 方法還會傳回新增的選單項目數量。</p>
1001
1002<p class="note"><strong>注意:</strong>當您呼叫 {@link
1003android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
1004addIntentOptions()} 時,它會覆寫第一個引數中所指定選單群組中的任何或所有選單項目。
1005</p>
1006
1007
1008<h3 id="AllowingToAdd">允許將 Activity 新增至其他選單</h3>
1009
1010<p>您也能向其他應用程式提供 Activity 的服務,這樣即可在其他應用程式的選單中包含您的應用程式 (與上述的角色顛倒)。
1011</p>
1012
1013<p>如要包含在其他應用程式選單中,您必須照常定義意圖篩選器,但務必為意圖篩選器類別納入
1014{@link android.content.Intent#CATEGORY_ALTERNATIVE} 和/或 {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} 值。
1015
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">意圖和意圖篩選器</a>。
1027</p>
1028
1029<p>如需採用此技術的範例應用程式,請參閱 <a href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">NotePad</a> 範例程式碼。
1030
1031</p>
1032