菜單是應(yīng)用程序中非常重要的組成部分,能夠在不占用界面空間的前提下,為應(yīng)用程序提供統(tǒng)一的功能和設(shè)置界面,并為程序開發(fā)人員提供了易于使用的編程接口。Android系統(tǒng)支持3種菜單:選項菜單(Option Menu)、子菜單(Submenu)、快捷菜單(Context Menu)。本文先來介紹Android選項菜單
選項菜單是一種經(jīng)常被使用的Android系統(tǒng)菜單,可以分為圖標菜單(Icon Menu)和擴展菜單(Expanded Menu)兩類,可通過“菜單鍵”(Menu key)打開。
圖標菜單能夠同時顯示文字和圖標,多支持6個子項,但圖標菜單不支持單選框和復(fù)選框。
擴展菜單在圖標菜單子項多余6個時才出現(xiàn),通過點擊圖標菜單后的子項“More”才能打開。擴展菜單是垂直的列表型菜單,不能夠顯示圖標,但支持單選框和復(fù)選框。

圖1 Tab標簽頁效果圖 圖2 擴展菜單
1.重寫onCreateOptionMenu()方法
在Android應(yīng)用程序中使用選項菜單,需重載Activity的onCreateOptionMenu()方法。初次使用選項菜單時,會調(diào)用onCreateOptionMenu()方法,用來初始化菜單子項的相關(guān)內(nèi)容,因此這里需要設(shè)置菜單子項自身的子項ID和組ID、菜單子項顯示的文字和圖片等。代碼如代碼清單1所示。
代碼清單1 重載onCreateOptionMenu()方法
final static int MENU_DOWNLOAD = Menu.FIRST;
final static int MENU_UPLOAD = Menu.FIRST+1;
@Override
public boolean onCreateOptionsMenu(Menu menu){
menu.add(0,MENU_DOWNLOAD,0,"下載設(shè)置");
menu.add(0,MENU_UPLOAD,1,"上傳設(shè)置");
return true;
}
第1行和第2行代碼將菜單子項ID定義成靜態(tài)常量,并使用靜態(tài)常量Menu.FIRST(整數(shù)類型,值為1)定義第一個菜單子項,以后的菜單子項僅需在Menu.FIRST增加相應(yīng)的數(shù)值即可。
第4行代碼Menu對象作為一個參數(shù)被傳遞到方法內(nèi)部,因此在onCreateOptionsMenu()方法中,用戶可以使用Menu對象的add()方法添加菜單子項。其中add()方法的語法如下。
代碼清單5-24 tab2.xml
MenuItem android.view.Menu.add(int groupId, int itemId, int order, CharSequence title)
第1個參數(shù)groupId是組ID,用以批量的對菜單子項進行處理和排序;第2個參數(shù)itemId是子項ID,是每一個菜單子項的唯一標識,通過子項ID使應(yīng)用程序能夠定位到用戶所選擇的菜單子項;第3個參數(shù)order是定義菜單子項在選項菜單中的排列順序;第4個參數(shù)title是菜單子項所顯示的標題。
第7行代碼是onCreateOptionsMenu()方法返回值,方法的返回值類型為布爾型:返回true將顯示方法中設(shè)置的菜單,否則不能夠顯示菜單。
做完以上步驟后,使用setIcon()方法和setShortcut()方法,添加菜單子項的圖標和快捷鍵,如代碼清單2所示。
代碼清單2 添加菜單子項的圖標和快捷鍵
menu.add(0,MENU_DOWNLOAD,0,"下載設(shè)置")
.setIcon(R.drawable.download);
.setShortcut(','d');
代碼中,利用MENU_DOWNLOAD菜單設(shè)置圖標和快捷鍵的代碼;第2行代碼中使用了新的圖像資源,用戶將需要使用的圖像文件復(fù)制到/res/drawable目錄下;setShortcut()方法第一個參數(shù)是為數(shù)字鍵盤設(shè)定的快捷鍵,第二個參數(shù)是為全鍵盤設(shè)定的快捷鍵,且不區(qū)分字母的大小寫。
2.重寫onPrepareOptionsMenu()方法
重載onPrepareOptionsMenu()方法,能夠動態(tài)地添加、刪除菜單子項,或修改菜單的標題、圖標和可見性等內(nèi)容。onPrepareOptionsMenu()方法的返回值的含義與onCreateOptions
Menu()方法相同:返回true則顯示菜單,返回false則不顯示菜單。
代碼清單3所示的代碼是在用戶每次打開選項菜單時,在菜單子項中顯示用戶打開該子項的次數(shù)。
代碼清單3 菜單子項中顯示用戶打開該子項的次數(shù)
static int MenuUploadCounter = 0;
@Override
public boolean onPrepareOptionsMenu(Menu menu){
MenuItem uploadItem = menu.findItem(MENU_UPLOAD);
uploadItem.setTitle("上傳設(shè)置:" +String.valueOf(MenuUploadCounter));
return true;
}
第1行代碼設(shè)置一個菜單子項的計數(shù)器,用來統(tǒng)計用戶打開“上傳設(shè)置”子項的次數(shù);第4行代碼是通過將菜單子項的ID傳遞給menu.findItem()方法,獲取到菜單子項的對象;第5行代碼是通過MenuItem的setTitle()方法修改菜單標題。
注:onCreateOptionMenu()方法和onPrepareOptionsMenu()方法的區(qū)別在于:onCreateOptionMenu()方法在Menu顯示之前只調(diào)用一次;而onPrepareOptionsMenu()方法在每次顯示Menu之前都會調(diào)用,一般用它執(zhí)行Menu的更新操作。
3.onOptionsItemSelected ()方法
onOptionsItemSelected ()方法能夠處理菜單選擇事件,且該方法在每次單擊菜單子項時都會被調(diào)用。
下面的代碼說明了如何通過菜單子項的ID執(zhí)行不同的操作。
代碼清單4 onOptionsItemSelected()
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case MENU_DOWNLOAD:
MenuDownlaodCounter++;
return true;
case MENU_UPLOAD:
MenuUploadCounter++;
return true;
}
return false;
}
onOptionsItemSelected ()的返回值表示是否對菜單的選擇事件進行處理,如果已經(jīng)處理過則返回true,否則返回false;第3行的MenuItem.getItemId()方法可以獲取到被選擇菜單子項的ID。
程序運行后,通過單擊“菜單鍵”可以調(diào)出程序設(shè)計的兩個菜單子項,如圖5-22所示。

圖3 運行效果圖