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><menu></code></dt> 131 <dd>定義選單項目的容器 {@link android.view.Menu}。<code><menu></code> 元素必須是檔案的根節點,並可保留一或多個 132<code><item></code> 與 <code><group></code> 元素。 133</dd> 134 135 <dt><code><item></code></dt> 136 <dd>建立代表選單中單一項目的 {@link android.view.MenuItem}。此元素可以包含巢狀 137<code><menu></code> 元素以建立子選單。</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>項目獨有的資源 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 <menu>} 元素新增為 {@code <item>} 的子項,將子選單新增至任何選單 (子選單除外) 的項目。 179當您的應用程式有很多可按主題分類的功能,例如 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>選項選單中的項目會顯示在螢幕上的哪個位置,取決於您為其開發應用程式的版本。 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 <item>} 元素,將要顯示在動作列的幾個項目升階 (請參閱圖 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 <item>} 中,利用其 {@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@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@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@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@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 @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} 物件。您可以使用 {@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 @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>在某些情況下,內容關聯動作提供一般動作項目,因為使用者可能未發現有長按行為,所以您可能希望新增核取方塊或類似的 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<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@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>}元素內,或使用 {@link 822android.view.Menu#add(int,int,int,int) add()} 方法指定群組 ID 來建立群組。 823</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例如,如果您針對每個項目宣告 {@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 <item>} 元素中的 {@code 870android:checkable} 屬性,為個別的選單項目定義可勾選行為,或利用 {@code <group>} 元素中的 {@code android:checkableBehavior} 屬性來為整個群組定義。 871例如,此選單群組中的所有項目都可以利用選項按鈕勾選。 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>您可以使用 897{@code <item>} 元素中的 {@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@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@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<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">意圖和意圖篩選器</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