>這里有一些大多數(shù)菜單項(xiàng)都有的特性
當(dāng)我們添加新的條目到一個(gè)菜單中,你可以讓所有條目包含在一個(gè)組中,菜單組是菜單條目的集合,里面的菜單那項(xiàng)可以共享某些特性,比如是否可見、可用、可選。
一個(gè)菜單組被定義為整形(或者在xml中配置一個(gè)資源id),往menu中使用add()方法添加菜單項(xiàng)時(shí),如果參數(shù)中包含了菜單組的id,那么這個(gè)條目會(huì)添加到相應(yīng)的菜單組中。比如add(int,int,int,int)。使用setGroupVisible()方法可以設(shè)置整個(gè)組是否隱藏。setGroupEnabled()發(fā)那個(gè)發(fā)設(shè)置整個(gè)組是否可用,setGroupCheckable()設(shè)置整個(gè)組是否可選。
任何菜單項(xiàng)都有是否可選的接口。可以是一個(gè)獨(dú)立的選擇框、單選框、單選按鈕復(fù)選框,參考上面截圖。
注意:在Icon菜單中,菜單項(xiàng)不能顯示為但則狂或者單選按鈕。如果你想在icon菜單中讓條目可選,必須自己在狀態(tài)改變時(shí)改變條目的現(xiàn)實(shí)。
想讓一個(gè)條目可選,可以使用setCheckable()方法,像這樣。
- view plaincopy to clipboardprint?
menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")
.setCheckable(true);
復(fù)制代碼這樣會(huì)顯示一個(gè)選擇框(前提是他不是一個(gè)icon菜單),當(dāng)條目被選中時(shí),onOptionsItemSelected()回調(diào)方法會(huì)被調(diào)用。這里你必須設(shè)置選擇框的狀態(tài),你可以使用isChecked()查詢當(dāng)前狀態(tài)或者使用setChecked()方法設(shè)置狀態(tài)。類似于onOptionsItemsSelected()方法。 - view plaincopy to clipboardprint?
switch (item.getItemId()) {
case VIBRATE_SETTING_ID:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
...
}
復(fù)制代碼如果想讓幾個(gè)radio選擇按鈕成為一個(gè)單選按鈕組,可以設(shè)置相同的groupId,然后調(diào)用setGroupCheckable()方法即可。這種情況下,不用每個(gè)item都調(diào)用setCheckable()方法,下面是一個(gè)子菜單中的兩個(gè)單選按鈕組: - view plaincopy to clipboardprint?
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);
復(fù)制代碼在setGroupCheckable()方法中,第一個(gè)參數(shù)為要設(shè)置的groupId,第二個(gè)為菜單項(xiàng)是否可選,最后一個(gè)參數(shù)是是否為單選(設(shè)為false的則所有item選擇情況相互獨(dú)立,即可以多選),當(dāng)group設(shè)為單選時(shí),每一次有條目被選中時(shí),其他選項(xiàng)自動(dòng)設(shè)置為未選狀態(tài)(即單選)。注意:可選菜單按鈕是基于會(huì)話的,其狀態(tài)、結(jié)果并不會(huì)保存在設(shè)備上。如截圖所示:在地圖程序中的設(shè)置并不會(huì)保存。如果你想把設(shè)置的記過保存,可以使用Preferences累,并且使用PreferencesActivity類來管理他們。使用setAlphabeticShortcut(char)方法,可以給菜單項(xiàng)中添加快捷鍵,使用setNumericShortcut(int)可以設(shè)置數(shù)字快捷鍵,或者使用setShortCut(char,int)。大小寫不敏感,例如: - view plaincopy to clipboardprint?
menu.add(0, MENU_QUIT, 0, "Quit")
.setAlphabeticShortcut(q);
復(fù)制代碼現(xiàn)在,當(dāng)菜單打開時(shí),或者按下menu鍵時(shí),按下q鍵將會(huì)選擇這個(gè)條目。這個(gè)快捷鍵會(huì)當(dāng)成菜單項(xiàng)的一個(gè)小提示來顯示,在菜單項(xiàng)標(biāo)簽的下面(icon菜單除外)。注意:快捷鍵不能加載Context菜單中。如果你閱讀了以前的章節(jié),你會(huì)對(duì)Android Intents有所熟悉,它允許應(yīng)用程序綁定到其他程序上,共享信息,各個(gè)任務(wù)間通信。就像你的程序可以啟動(dòng)一個(gè)web瀏覽器、或者email客戶端或者其他的activity,你可以在一個(gè)菜單中運(yùn)行它們。有兩種方式:為每個(gè)菜單項(xiàng)定義一個(gè)intent;或者定義intent然后允許Android自動(dòng)搜索activity,并為每個(gè)符合條件的activity添加菜單項(xiàng)。關(guān)于建立intents和為程序提供服務(wù)的詳細(xì)信息,可以參考Intents and Intent Filter 章節(jié)為單獨(dú)的菜單項(xiàng)設(shè)置intent如果你想讓一個(gè)菜單項(xiàng)運(yùn)行一個(gè)新的activity,那么你需要調(diào)用菜單項(xiàng)的setIntent()方發(fā)來定義intent。例如,在onCreateOptionMenu()里,你可以這樣定義: - view plaincopy to clipboardprint?
MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");
menuItem.setIntent(new Intent(this, PhotoPicker.class));
復(fù)制代碼當(dāng)點(diǎn)擊菜單項(xiàng)時(shí),android 會(huì)自動(dòng)運(yùn)行設(shè)置好的activity。注意:這種運(yùn)行方式不會(huì)返回?cái)?shù)據(jù),如果你想得到返回?cái)?shù)據(jù),那么不能使用setIntent()方法。你應(yīng)該在onOptionsMenuItemSelected()方法或onContextMenuItemSelected()方法中調(diào)用startActivityForResult()方法。當(dāng)前程序或者當(dāng)前選項(xiàng)有可能會(huì)關(guān)聯(lián)很多的activity,所以程序便可以動(dòng)態(tài)的添加菜單項(xiàng)來執(zhí)行那些操作。在創(chuàng)建menu菜單時(shí),根據(jù)當(dāng)前選定項(xiàng)的MIME類型,來使用Intent.ALTERNATIVE_CATEGORY或者Intent.SELECTED_ALTERNATIVE這兩個(gè)參數(shù)來設(shè)置intent的分類,或者其他的參數(shù)來讓intent filter (intent過濾器)啟動(dòng)一個(gè)新的acticity。然后調(diào)用addIntentOptions()來讓android搜索到符合要求的服務(wù)并且添加到menu菜單中。如果沒有合適的相應(yīng)程序則菜單不添加條目。注意:SELECTED_ALTERNATIVE 處理當(dāng)前屏幕里選中項(xiàng),所以,之有當(dāng)在onCreateContextMenu()方法和onPrepareOptionsMenu()方法里建立菜單時(shí)時(shí)才能使用。下面的例子,展示了程序怎樣找到額外的服務(wù)來顯示到菜單中。 - view plaincopy to clipboardprint?
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 correlate to specific items (none)
return true;
}
復(fù)制代碼當(dāng)activity發(fā)現(xiàn)有合適的intent過濾器時(shí),便會(huì)添加一個(gè)相應(yīng)的menu菜單項(xiàng),菜單項(xiàng)會(huì)顯示lable標(biāo)簽的內(nèi)容。addIntentOptions()方法會(huì)返回添加的菜單項(xiàng)的個(gè)數(shù)。必須注意:當(dāng)addIntentOptions()方法被調(diào)用時(shí),他將會(huì)覆蓋第一個(gè)參數(shù)所指定菜單里的所有項(xiàng)。如果你想為其他菜單提供服務(wù),你只需要定義一個(gè)intent filter,只要再<category>標(biāo)簽里包含 ALTERNATIVE 或者 SELECTED_ALTERNATIVE 即可,例如: - view plaincopy to clipboardprint?
<intent-filter label="Resize Image">
...
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
...
</intent-filter>
復(fù)制代碼
|