菜單特性 Menu Features
下面是適用于大多數(shù)菜單項(xiàng)的一些其他的特性。
菜單組 Menu groups
當(dāng)往菜單中添加新項(xiàng)時(shí),你可以選擇把它包含在一個(gè)組中。一個(gè)菜單組是一些可以共享某些特征的菜單項(xiàng)的集合,比如它們是否可見(jiàn),是否可用,或者可否復(fù)選( checkable )。
一個(gè)組由一個(gè)整數(shù)定義(或者一個(gè) XML 里的資源 ID )。當(dāng)我們使用接受一個(gè) groupId 參數(shù)的 add() 方法,比如 add(int, int, int, int) 添加項(xiàng)時(shí),它將被添加到組中。
你可以通過(guò) setGroupVisible() 顯示或隱藏菜單組;通過(guò)啟用或禁用這個(gè)組;以及通過(guò) setGroupCheckable() 設(shè)置菜單項(xiàng)是否可以復(fù)選。
可復(fù)選菜單項(xiàng) Checkable menu items
任何菜單項(xiàng)可以被用來(lái)表示選項(xiàng)開(kāi)關(guān)的接口。這可以通過(guò)一個(gè) checkbox 來(lái)指示一個(gè)單獨(dú)的選項(xiàng),或者通過(guò)一組單選按鈕來(lái)表示互斥選項(xiàng)。(查看右邊的截屏)。
注意 : 在圖標(biāo)菜單中的菜單項(xiàng)不能顯示復(fù)選框或單選按鈕。如果你選擇讓圖標(biāo)按鈕中的菜單項(xiàng)變成可復(fù)選,那你必須在開(kāi)關(guān)狀態(tài)變化時(shí)自動(dòng)通過(guò)切換圖標(biāo)和文本來(lái)指示這個(gè)狀態(tài)。
要讓一個(gè)單獨(dú)的項(xiàng)變成可復(fù)選,使用 setCheckable() 方法,如下:
menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")
.setCheckable(true);
這將為這個(gè)菜單項(xiàng)顯示一個(gè)復(fù)選框(除非這是個(gè)圖標(biāo)菜單)。當(dāng)這個(gè)
item
被選中時(shí),通常
onOptionsItemSelected()
會(huì)被調(diào)用。你應(yīng)該在這里設(shè)置復(fù)選框狀態(tài)。你可以用
isChecked()
來(lái)查詢這個(gè)菜單項(xiàng)的當(dāng)前狀態(tài)和用
setChecked()
來(lái)設(shè)置復(fù)選狀態(tài)。就像下面一樣:
switch (item.getItemId()) {
case VIBRATE_SETTING_ID:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
...
}
為了創(chuàng)建一組互斥的單選按鈕,只要簡(jiǎn)單的為每個(gè)菜單項(xiàng)分配相同的
group ID
并調(diào)用
setGroupCheckable()
。在這個(gè)例子里,你不需要為每個(gè)菜單項(xiàng)調(diào)用
setCheckable()
方法,因?yàn)檫@個(gè)組被整體上設(shè)置為可復(fù)選。下面是在一個(gè)子菜單中創(chuàng)建兩個(gè)互斥選項(xiàng)的例子:
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()
方法里,第一個(gè)參數(shù)是我們想設(shè)置為可復(fù)選的
group ID
。第二個(gè)參數(shù)表示是否設(shè)置為可復(fù)選。最后一個(gè)參數(shù)代表這些菜單項(xiàng)是否互斥(如果設(shè)置為
false
,則所有的菜單項(xiàng)將會(huì)是復(fù)選框而不是單選按鈕。當(dāng)這個(gè)組設(shè)置為互斥時(shí)(單選按鈕),每當(dāng)一個(gè)新的項(xiàng)被選中時(shí),所有其它的項(xiàng)的選擇會(huì)自動(dòng)被清除。
注意 : 可復(fù)選菜單項(xiàng)傾向于基于每次會(huì)話使用,而不保存到設(shè)備中。(例如,地圖應(yīng)用程序中的 Map mode 設(shè)置并不會(huì)被保存 - 截屏如上)。如果有一些應(yīng)用程序設(shè)置你需要為用戶保存它,那你應(yīng)該使用首選項(xiàng) Preferences 來(lái)保存數(shù)據(jù),而通過(guò)一個(gè) PreferenceActivity 來(lái)管理它們。
快捷鍵 Shortcut keys
可以為菜單項(xiàng)添加字母或數(shù)字快捷鍵,
setAlphabeticShortcut(char)
方法(設(shè)置字母快捷鍵),
setNumericShortcut(int)
方法(設(shè)置數(shù)字快捷鍵),或者
setShortcut(char,int)
(同時(shí)設(shè)置字母和數(shù)字)。非大小寫(xiě)敏感,比如:
menu.add(0, MENU_QUIT, 0, "Quit")
.setAlphabeticShortcut('q');
現(xiàn)在,當(dāng)菜單打開(kāi)時(shí)(或者按住菜單鍵),按 ”q” 鍵將選擇該菜單項(xiàng)。
這個(gè)快捷鍵將以菜單項(xiàng)的提示信息而顯示在菜單項(xiàng)名稱的下面(除了圖標(biāo)菜單項(xiàng))。
注意 : 快捷鍵不能添加進(jìn)一個(gè)上下文菜單項(xiàng)中。
菜單項(xiàng)意圖 Menu item intents
如果你已經(jīng)閱讀過(guò)應(yīng)用程序基礎(chǔ) Application Fundamentals ,那么你應(yīng)該多少知道一點(diǎn) Android 意圖。它允許程序互相綁定,分享信息,以及合作執(zhí)行用戶任務(wù)。就像你的應(yīng)用程序可以發(fā)送一個(gè)意圖來(lái)啟動(dòng)瀏覽器,郵件客戶端或者另外一個(gè)活動(dòng)一樣,你可以從菜單中執(zhí)行這樣的動(dòng)作。有兩種途徑來(lái)做這件事:定義一個(gè)意圖然后分配給一個(gè)單獨(dú)的菜單項(xiàng),或者定義一個(gè)意圖并允許 Android 查找設(shè)備上的活動(dòng)然后動(dòng)態(tài)的為每個(gè)符合意圖標(biāo)準(zhǔn)的活動(dòng)添加一個(gè)菜單項(xiàng)。
請(qǐng)閱讀意圖和意圖過(guò)濾器章節(jié),以獲取更多關(guān)于意圖創(chuàng)建和應(yīng)用程序提供服務(wù)方面的信息。
為一個(gè)單獨(dú)的菜單項(xiàng)設(shè)置一個(gè)意圖 Set an intent for a single menu item
如果你想提供一個(gè)具體的菜單項(xiàng)來(lái)啟動(dòng)一個(gè)新的活動(dòng),那么你可以通過(guò) setIntent() 方法具體地為這個(gè)菜單項(xiàng)定義一個(gè)意圖。
比如,在 onCreateOptionsMenu() 方法里,你可以用一個(gè)意圖定義一個(gè)新菜單項(xiàng)如下:
MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");
menuItem.setIntent(new Intent(this, PhotoPicker.class));
當(dāng)這個(gè)菜單項(xiàng)被選中時(shí), Android 將自動(dòng)啟動(dòng)這個(gè)活動(dòng)。
注意
:
這并不會(huì)給你的活動(dòng)返回一個(gè)結(jié)果。如果你希望返回一個(gè)結(jié)果,那么不要使用
setIntent()
。相反,和通常情況一樣在
onOptionsMenuItemSelected()
or
onContextMenuItemSelected()
回調(diào)中處理并調(diào)用
startActivityForResult()
.
動(dòng)態(tài)添加意圖 Dynamically add intents
如果有潛在的多個(gè)活動(dòng)和你的當(dāng)前活動(dòng)或所選擇菜單項(xiàng)相關(guān),那么這個(gè)應(yīng)用程序可以動(dòng)態(tài)添加菜單項(xiàng)來(lái)執(zhí)行其他的服務(wù)。
在菜單創(chuàng)建過(guò)程中,定義一個(gè)意圖,使用 Intent.ALTERNATIVE_CATEGORY 和 / 或 Intent.SELECTED_ALTERNATIVE 類別,當(dāng)前選擇(如果有的話)的 MIME 類型,以及其他需求,和你打開(kāi)一個(gè)新活動(dòng)時(shí)想要滿足一個(gè)意圖過(guò)濾器一樣。然后調(diào)用 addIntentOptions() 來(lái)讓 Android 查找任何滿足那些需求的服務(wù)并為你添加它們到菜單中。如果已安裝的程序沒(méi)有滿足這個(gè)意圖的,那么將不會(huì)有額外的菜單項(xiàng)被添加。
注意
:
SELECTED_ALTERNATIVE
是用來(lái)處理屏幕當(dāng)前選中元素的。所以,它應(yīng)該僅當(dāng)在
onCreateContextMenu()
或
onPrepareOptionsMenu()
里面創(chuàng)建菜單項(xiàng)時(shí)使用
,
后者每次打開(kāi)選項(xiàng)菜單時(shí)會(huì)被調(diào)用。
下面是一個(gè)說(shuō)明應(yīng)用程序如何搜索附加服務(wù)來(lái)顯示在它的菜單中的例子。
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;
}
對(duì)于每個(gè)活動(dòng),如果其意圖過(guò)濾器匹配我們所定義的那個(gè)意圖,則將會(huì)添加一個(gè)菜單項(xiàng),使用這個(gè)意圖過(guò)濾器的 android:label 值作為菜單項(xiàng)的文本。這個(gè) addIntentOptions() 方法也會(huì)返回所增加菜單項(xiàng)的數(shù)目。
請(qǐng)同時(shí)注意,當(dāng)
addIntentOptions()
被調(diào)用時(shí),它將重寫(xiě)第一個(gè)參數(shù)指定的所有菜單組里的菜單項(xiàng)。
如果想把你的活動(dòng)的服務(wù)提供給其他應(yīng)用程序菜單,那么你只需要和通常情況一樣定義一個(gè)意圖過(guò)濾器。只是需要確保在一個(gè)意圖過(guò)濾器的
<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>
在意圖和意圖過(guò)濾器文章中有更多關(guān)于創(chuàng)建意圖過(guò)濾器的描述。
要了解使用該技術(shù)的一個(gè)例子應(yīng)用程序,可查看 NotePad 范例代碼。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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