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