菜單特性 Menu Features
下面是適用于大多數菜單項的一些其他的特性。
菜單組 Menu groups
當往菜單中添加新項時,你可以選擇把它包含在一個組中。一個菜單組是一些可以共享某些特征的菜單項的集合,比如它們是否可見,是否可用,或者可否復選( checkable )。
一個組由一個整數定義(或者一個 XML 里的資源 ID )。當我們使用接受一個 groupId 參數的 add() 方法,比如 add(int, int, int, int) 添加項時,它將被添加到組中。
你可以通過 setGroupVisible() 顯示或隱藏菜單組;通過啟用或禁用這個組;以及通過 setGroupCheckable() 設置菜單項是否可以復選。
可復選菜單項 Checkable menu items
任何菜單項可以被用來表示選項開關的接口。這可以通過一個 checkbox 來指示一個單獨的選項,或者通過一組單選按鈕來表示互斥選項。(查看右邊的截屏)。
注意 : 在圖標菜單中的菜單項不能顯示復選框或單選按鈕。如果你選擇讓圖標按鈕中的菜單項變成可復選,那你必須在開關狀態變化時自動通過切換圖標和文本來指示這個狀態。
要讓一個單獨的項變成可復選,使用 setCheckable() 方法,如下:
menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")
.setCheckable(true);
這將為這個菜單項顯示一個復選框(除非這是個圖標菜單)。當這個
item
被選中時,通常
onOptionsItemSelected()
會被調用。你應該在這里設置復選框狀態。你可以用
isChecked()
來查詢這個菜單項的當前狀態和用
setChecked()
來設置復選狀態。就像下面一樣:
switch (item.getItemId()) {
case VIBRATE_SETTING_ID:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
...
}
為了創建一組互斥的單選按鈕,只要簡單的為每個菜單項分配相同的
group ID
并調用
setGroupCheckable()
。在這個例子里,你不需要為每個菜單項調用
setCheckable()
方法,因為這個組被整體上設置為可復選。下面是在一個子菜單中創建兩個互斥選項的例子:
SubMenu subMenu = menu.addSubMenu("Color");
subMenu.add(COLOR_MENU_GROUP, COLOR_RED_ID, 0, "Red");
subMenu.add(COLOR_MENU_GROUP, COLOR_BLUE_ID, 0, "Blue");
subMenu.setGroupCheckable(COLOR_MENU_GROUP, true, true);
在
setGroupCheckable()
方法里,第一個參數是我們想設置為可復選的
group ID
。第二個參數表示是否設置為可復選。最后一個參數代表這些菜單項是否互斥(如果設置為
false
,則所有的菜單項將會是復選框而不是單選按鈕。當這個組設置為互斥時(單選按鈕),每當一個新的項被選中時,所有其它的項的選擇會自動被清除。
注意 : 可復選菜單項傾向于基于每次會話使用,而不保存到設備中。(例如,地圖應用程序中的 Map mode 設置并不會被保存 - 截屏如上)。如果有一些應用程序設置你需要為用戶保存它,那你應該使用首選項 Preferences 來保存數據,而通過一個 PreferenceActivity 來管理它們。
快捷鍵 Shortcut keys
可以為菜單項添加字母或數字快捷鍵,
setAlphabeticShortcut(char)
方法(設置字母快捷鍵),
setNumericShortcut(int)
方法(設置數字快捷鍵),或者
setShortcut(char,int)
(同時設置字母和數字)。非大小寫敏感,比如:
menu.add(0, MENU_QUIT, 0, "Quit")
.setAlphabeticShortcut('q');
現在,當菜單打開時(或者按住菜單鍵),按 ”q” 鍵將選擇該菜單項。
這個快捷鍵將以菜單項的提示信息而顯示在菜單項名稱的下面(除了圖標菜單項)。
注意 : 快捷鍵不能添加進一個上下文菜單項中。
菜單項意圖 Menu item intents
如果你已經閱讀過應用程序基礎 Application Fundamentals ,那么你應該多少知道一點 Android 意圖。它允許程序互相綁定,分享信息,以及合作執行用戶任務。就像你的應用程序可以發送一個意圖來啟動瀏覽器,郵件客戶端或者另外一個活動一樣,你可以從菜單中執行這樣的動作。有兩種途徑來做這件事:定義一個意圖然后分配給一個單獨的菜單項,或者定義一個意圖并允許 Android 查找設備上的活動然后動態的為每個符合意圖標準的活動添加一個菜單項。
請閱讀意圖和意圖過濾器章節,以獲取更多關于意圖創建和應用程序提供服務方面的信息。
為一個單獨的菜單項設置一個意圖 Set an intent for a single menu item
如果你想提供一個具體的菜單項來啟動一個新的活動,那么你可以通過 setIntent() 方法具體地為這個菜單項定義一個意圖。
比如,在 onCreateOptionsMenu() 方法里,你可以用一個意圖定義一個新菜單項如下:
MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");
menuItem.setIntent(new Intent(this, PhotoPicker.class));
當這個菜單項被選中時, Android 將自動啟動這個活動。
注意
:
這并不會給你的活動返回一個結果。如果你希望返回一個結果,那么不要使用
setIntent()
。相反,和通常情況一樣在
onOptionsMenuItemSelected()
or
onContextMenuItemSelected()
回調中處理并調用
startActivityForResult()
.
動態添加意圖 Dynamically add intents
如果有潛在的多個活動和你的當前活動或所選擇菜單項相關,那么這個應用程序可以動態添加菜單項來執行其他的服務。
在菜單創建過程中,定義一個意圖,使用 Intent.ALTERNATIVE_CATEGORY 和 / 或 Intent.SELECTED_ALTERNATIVE 類別,當前選擇(如果有的話)的 MIME 類型,以及其他需求,和你打開一個新活動時想要滿足一個意圖過濾器一樣。然后調用 addIntentOptions() 來讓 Android 查找任何滿足那些需求的服務并為你添加它們到菜單中。如果已安裝的程序沒有滿足這個意圖的,那么將不會有額外的菜單項被添加。
注意
:
SELECTED_ALTERNATIVE
是用來處理屏幕當前選中元素的。所以,它應該僅當在
onCreateContextMenu()
或
onPrepareOptionsMenu()
里面創建菜單項時使用
,
后者每次打開選項菜單時會被調用。
下面是一個說明應用程序如何搜索附加服務來顯示在它的菜單中的例子。
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
// Create an Intent that describes the requirements to fulfill, to be included
// in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
// Search for, and populate the menu with, acceptable offering applications.
menu.addIntentOptions(
thisClass.INTENT_OPTIONS,
// Menu group
0,
// Unique item ID (none)
0,
// Order for the items (none)
this.getComponentName(),
// The current Activity name
null,
// Specific items to place first (none)
intent, // Intent created above that describes our requirements
0,
// Additional flags to control items (none)
null);
// Array of MenuItems that corrolate to specific items (none)
return true;
}
對于每個活動,如果其意圖過濾器匹配我們所定義的那個意圖,則將會添加一個菜單項,使用這個意圖過濾器的 android:label 值作為菜單項的文本。這個 addIntentOptions() 方法也會返回所增加菜單項的數目。
請同時注意,當
addIntentOptions()
被調用時,它將重寫第一個參數指定的所有菜單組里的菜單項。
如果想把你的活動的服務提供給其他應用程序菜單,那么你只需要和通常情況一樣定義一個意圖過濾器。只是需要確保在一個意圖過濾器的
<category>
元素的
name
屬性中包含
ALTERNATIVE
和
/
或
SELECTED_ALTERNATIVE
值。比如:
<intent-filter label="Resize Image">
...
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
...
</intent-filter>
在意圖和意圖過濾器文章中有更多關于創建意圖過濾器的描述。
要了解使用該技術的一個例子應用程序,可查看 NotePad 范例代碼。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
