>
選項(xiàng)菜單通過(guò)按下menu鍵來(lái)顯示。當(dāng)菜單打開(kāi)時(shí),只顯示前六個(gè)選項(xiàng),如果超過(guò)六個(gè),多的部分會(huì)顯示在more里。超過(guò)的選項(xiàng)被添加到more菜單里是系統(tǒng)自動(dòng)添加的。
選項(xiàng)菜單可以包含一些基本的程序功能,或者必要的導(dǎo)航。比如從主界面轉(zhuǎn)到設(shè)置界面。你可以添加Submenus 來(lái)配置你的顯示項(xiàng),讓它包含更多的功能。
當(dāng)menu第一次被創(chuàng)建時(shí),android系統(tǒng)會(huì)調(diào)用activity的onCreateOptionsMenu()回調(diào)方法。要添加自己的menu只需要重寫(xiě)它即可。你可以在彈出的menu中包含著在xml中定義的資源?;蛘咄ㄟ^(guò)調(diào)用add()方法添加每一個(gè)選項(xiàng)。這個(gè)方法會(huì)添加一個(gè)MenuItem,并且返回你最新創(chuàng)建的對(duì)象。你可以使用它們來(lái)獲得菜單項(xiàng),然后添加一些額外的屬性,比如設(shè)置icon、快捷鍵等。
有很多種的add()方法,通常用的是能接收一個(gè)itemid參數(shù)的那個(gè),這個(gè)id可以讓你識(shí)別回調(diào)方法。
當(dāng)一個(gè)菜單項(xiàng)從菜單中被選中,你會(huì)接收一個(gè)回調(diào)方法onOptionItemSelected()。這個(gè)回調(diào)方法會(huì)傳遞你所點(diǎn)擊的菜單項(xiàng),可以通過(guò)傳來(lái)的id來(lái)判斷是哪個(gè)菜單項(xiàng)。一旦你定義了菜單項(xiàng),就可以添加適當(dāng)?shù)奶幚頃r(shí)間處理方法。
這里有一斷activity中的代碼,你可以這樣定義并且處理他們的選擇事件:
- view plaincopy to clipboardprint?
/* Creates the menu items */
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_NEW_GAME, 0, "New Game");
menu.add(0, MENU_QUIT, 0, "Quit");
return true;
}
/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_NEW_GAME:
newGame();
return true;
case MENU_QUIT:
quit();
return true;
}
return false;
}
復(fù)制代碼在這個(gè)例子中使用的add()方法有四個(gè)參數(shù):groupId、itemId、 order 和 title。groupId允許你將要添加的條目添加到groupId躲在項(xiàng)里。這個(gè)例子里,我們沒(méi)有設(shè)置。itemid 是我們給MenuItem的唯一的整型值,可以用在在回調(diào)方法中識(shí)別選中項(xiàng)。order允許我們自定義item顯示的順序,默認(rèn)情況下按照添加的順序顯示。title,就是顯示的標(biāo)簽名,你可以用String resource字符串資源的方式來(lái)添加,這有有助于本地化的修改。如果你想把幾個(gè)菜單項(xiàng)合成一組,你可以用Submenu來(lái)實(shí)現(xiàn)。 Icons可以通過(guò)setIcon()方法來(lái)添加。例如
menu.add(0, MENU_QUIT,
0,
"Quit").setIcon(R.drawable.menu_quit_icon); 如果你想在菜單被添加之后修改它,可以重寫(xiě)onPrepareOptionsMenu()方法,他在菜單每次被打開(kāi)時(shí)調(diào)用。他會(huì)傳遞你的menu對(duì)象,就像onCreateOptionsMenu()方法那樣。如果你想根據(jù)程序或者 游戲現(xiàn)在的狀態(tài)來(lái)確定是否修改menu 的話,這個(gè)方法將會(huì)非常有用。注意:當(dāng)改變menu里的菜單項(xiàng)時(shí),不提倡直接操作當(dāng)前選中項(xiàng)。請(qǐng)記住,當(dāng)在觸摸模式下,是沒(méi)有當(dāng)前選中項(xiàng)的,相反,你應(yīng)該使用Context Menu 來(lái)做這樣的操作:在UI的特定項(xiàng)目里提供這樣的功能。 android的 Context Menu 也是類似的,在PC上,即為右鍵菜單。當(dāng)一個(gè)view注冊(cè)了Context Menu 菜單后,長(zhǎng)按這個(gè)view便能顯示菜單,提供一些與此view相關(guān)的功能。Context menus可以使用任何的view,但通常被注冊(cè)成listView,這種view會(huì)使選中的項(xiàng)目非常的明顯。(待會(huì)會(huì)有一個(gè)例子)注意:Context Menu條目不支持圖標(biāo)和快捷鍵。要?jiǎng)?chuàng)建一個(gè)Context Menu,你必須重寫(xiě)activity的 Context Menu 回調(diào)方法:onCreateContextMenu()和 onContextItemSelected()方法。在onCreateContextMenu()回調(diào)方法中,你可以通過(guò)add()方法添加菜單項(xiàng),或者使用xml配置文件添加,然后yon registerForContextMenu()方法注冊(cè)成為ContextMenu。例如,下面是在筆記本應(yīng)用程序中添加contextMenu的例子: - view plaincopy to clipboardprint?
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, EDIT_ID, 0, "Edit");
menu.add(0, DELETE_ID, 0, "Delete");
}
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case EDIT_ID:
editNote(info.id);
return true;
case DELETE_ID:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
復(fù)制代碼在onCreateContextmenu()方法中,我們不僅僅只能給contextMenu添加菜單項(xiàng),而且還可以給選中的view或者是ContextMenuInfo對(duì)象添加。ContextMenuInfo對(duì)象提供了選中對(duì)象的一些相關(guān)信息。例如,在OnCreateContextMenu()方法中添加兩個(gè)很普通的item條目。在onContextItemSelected()方法中,我們需要得到菜單項(xiàng)的AdapterContextmenuInfo,來(lái)獲取關(guān)于當(dāng)前選中項(xiàng)的某些信息。我們只需要選中條目的id即可,所以無(wú)論添加或者刪除,我們只需要知道AdapterContextMenuInfo.info 這個(gè)屬性即可。然后這個(gè)id會(huì)被傳遞到deitNote()方法或者deleteNote方法來(lái)做相應(yīng)的處理。現(xiàn)在,為L(zhǎng)istView中所有的項(xiàng)添加contextMenu方法,我們把整個(gè)ListView傳遞給registerForContextMenu(View)方法。registerForContextMenu(getListView());記住,你可以傳遞任何view對(duì)象來(lái)注冊(cè) contextMenu菜單,getListView()方法會(huì)返回在ListActivity類中使用到的ListView,因此,list中的每一項(xiàng)都會(huì)注冊(cè)一個(gè)contextMenu。 一個(gè)子菜單可以被添加到任何菜單,但不不能添加到子菜單中。當(dāng)你的應(yīng)用程序有很多功能需要被顯示的時(shí)候非常有用。你可以用add()方法給menu添加額外的條目,例如: - view plaincopy to clipboardprint?
SubMenu fileMenu = menu.addSubMenu("File");
SubMenu editMenu = menu.addSubMenu("Edit");
fileMenu.add("new");
fileMenu.add("open");
fileMenu.add("save");
editMenu.add("undo");
editMenu.add("redo");
return result;
}
復(fù)制代碼子菜單中的回調(diào)方法會(huì)傳遞給父菜單的回調(diào)方法。如上所示:子菜單的選擇結(jié)果會(huì)傳遞到父菜單的onOptionsItemSelected(); 就像UI布局一樣,你可以在xml文件中定義菜單。然后再onCreate()方法中實(shí)例化他們。這樣會(huì)讓你的程序代碼更加簡(jiǎn)潔,并且讓代碼和視圖分離,更加可視化。首先,在res文件夾下建立一個(gè)menu文件夾。你可以在這里定義菜單。在一個(gè)菜單的xml布局中,有三個(gè)元素:<menu><group><item>。Item和group元素必須是menu的子元素,但item還可以是group的子元素,menu元素必須有一個(gè)子元素,當(dāng)然了,最外層的根元素必須是menu。作為一個(gè)例子,我們建一個(gè)和上面一樣的操作菜單,先在res/menu/文件夾下建一個(gè)option_menu.xml文件 - view plaincopy to clipboardprint?
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/new_game"
android:title="New Game" />
<item android:id="@+id/quit"
android:title="Quit" />
</menu>
復(fù)制代碼然后,在onCreateOptionsMenu()方法中,我們用MenuInflater.inflate()方法加載這個(gè)資源: - view plaincopy to clipboardprint?
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
return true;
}
復(fù)制代碼getMenuInflater()方法會(huì)返回activity的菜單解析器,我們可以調(diào)用inflate()方法來(lái)傳遞先前定義好的menu資源的指針,在回調(diào)方法中可以得到菜單對(duì)象。雖然這種方式看似更加麻煩,但當(dāng)你處理大量items時(shí)會(huì)為你省很多事,并且讓你的代碼看起來(lái)更加整潔。你可以定義menu group,在group元素里包裝item來(lái)定義menu group,并且在item里創(chuàng)建別的menu,每個(gè)元素都支持一些基本屬性如快捷鍵、選擇框、圖標(biāo)等。學(xué)習(xí)更多的屬性可以參考XML syntax.
|