理解Android的菜單菜單是許多應用程式不可或缺的一部分,Android中更是如此,所有搭載Android系統的手機甚至都要有一個"Menu"鍵,由此可見菜單在Android程式中的特殊性。Android SDK提供的菜單有如下幾種: 選項菜單:最常規的菜單,android中把它叫做option menu子功能表:android中點擊子功能表將彈出懸浮視窗顯示子功能表項。子功能表不支援嵌套,即子功能表中不能再包括其他子功能表。操作功能表:android中長按視圖控制項後出現的菜單,windows點擊右鍵彈出的菜單即操作功能表表徵圖菜單:這個比較簡單,就是帶icon的功能表項目,需要注意的是子功能表項、操作功能表項目、擴充功能表項目均無法顯示表徵圖。選擇菜單(alternative menu):用的比較少,以後單獨介紹,本文先跳過(其實是我還沒弄明白啦o(≧v≦)o~~)擴充菜單:選項菜單最多隻能顯示6個功能表項目,超過6個時,第6個功能表項目會被系統替換為一個叫“更多”的子功能表,原來顯示不下的功能表項目都作為“更多”菜單的子功能表項。如: 第6個功能表項目自動變為“更多” 點擊“更多”顯示其他功能表項目 Android3.0又引入了一個叫action bar的東西,本文不做講解,大家自己google。 android.view.Menu介面代表一個菜單,android用它來管理各種功能表項目。注意我們一般不自己建立menu,因為每個Activity預設都內建了一個,我們要做的是為它加功能表項目和響應功能表項目的點擊事件。android.view.MenuItem代表每個功能表項目,android.view.SubMenu代表子功能表。其三者的關係可以用來表示 上面說過,每個activity包含一個菜單,一個菜單又能包含多個功能表項目和多個子功能表,子功能表其實也是菜單(因為它實現了Menu介面),因此子功能表也可以包含多個功能表項目。SubMenu繼承了Menu的addSubMenu()方法,但調用時會拋出執行階段錯誤。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了兩個回調方法,用於建立功能表項目和響應功能表項目的點擊。 建立options menu之前提到,Android的activity已經為我們提前建立好了android.view.Menu對象,並提供了回調方法onCreateOptionsMenu(Menu menu)供我們初始化菜單的內容。該方法只會在選項菜單第一次顯示的時候被執行,如果你需要動態改變選項菜單的內容,請使用 onPrepareOptionsMenu(Menu)。 @Overridepublicboolean onCreateOptionsMenu(Menu menu) { // 調用父類方法來加入系統功能表 // 雖然目前android還沒有系統功能表,但是為了相容到以後的版本,最好加上super.onCreateOptionsMenu(menu); // 添加功能表項目(多種方式) // 1.直接指定標題 menu.add("功能表項目1"); // 2.通過資源指定標題 menu.add(R.string.menuitem2); // 3.顯示指定功能表項目的組號、ID、排序號、標題 menu.add( 1, //組號 Menu.FIRST, //唯一的ID號 Menu.FIRST, //排序號"功能表項目3"); //標題 // 如果希望顯示菜單,請返回truereturntrue;} 上面的代碼示範了添加功能表項目的3種方法,下面解釋下第三種方法add(int groupId, int itemId, int order, CharSequence title)。其中,第一個參數是組號,android中你可以給菜單分組,以便快速地操作同一組的菜單。第二個參數指定每個功能表項目的唯一ID號,你可以自己指定,也可以讓系統來自動分配,在響應菜單時你需要通過ID號來判斷哪個菜單被點擊了。因此常規的做法是定義一些ID常量,但在android中有更好的方法,就是通過資源檔來引用,這個之後介紹。第三個參數代表功能表項目顯示順序的編號,編號小的顯示在前面。 給功能表項目分組 @Overridepublicboolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); // 添加4個功能表項目,分成2組int group1 =1; int gourp2 =2; menu.add(group1, 1, 1, "item 1"); menu.add(group1, 2, 2, "item 2"); menu.add(gourp2, 3, 3, "item 3"); menu.add(gourp2, 4, 4, "item 4"); // 顯示菜單returntrue;} 你可以向上面這樣給功能表項目分組,分組之後就能使用menu中提供的方法對組進行操作了,如下: menu.removeGroup(group1); //刪除一組菜單menu.setGroupVisible(gourp2, visible); //設定一組菜單是否可見menu.setGroupEnabled(gourp2, enabled); //設定一組菜單是否可點menu.setGroupCheckable(gourp2, checkable, exclusive); //設定一組菜單的勾選情況 響應功能表項目android提供了多種響應功能表項目的方式,下面一一介紹 1、通過onOptionsItemSelected方法使用的最多方法是重寫activity類的 onOptionsItemSelected(MenuItem)回調方法,每當有功能表項目被點擊時,android就會調用該方法,並傳入被點擊功能表項目。 @Overridepublicboolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { //響應每個功能表項目(通過功能表項目的ID)case1: // do something herebreak; case2: // do something herebreak; case3: // do something herebreak; case4: // do something herebreak; default: //對沒有處理的事件,交給父類來處理returnsuper.onOptionsItemSelected(item); } //返回true表示處理完功能表項目的事件,不需要將該事件繼續傳播下去了returntrue;} 以上代碼可作為使用onOptionsItemSelected方法響應菜單的模板來使用,這裡為了方便起見將菜單ID寫入程式碼在程式裡,你可以使用常量或資源ID來使代碼更健壯。 2.使用監聽器雖然第一種方法是推薦使用的方法,android還是提供了類似java swing的監聽器方式來響應菜單。使用監聽器的方式分為兩步: //第一步:建立監聽器類class MyMenuItemClickListener implements OnMenuItemClickListener { @Override publicboolean onMenuItemClick(MenuItem item) { // do something here...returntrue; //finish handling }} //第二步:為功能表項目註冊監聽器menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener()); android文檔對onMenuItemClick(MenuItem item)回調方法的說明是"Called when a menu item has been invoked. This is the first code that is executed; if it returns true, no other callbacks will be executed." 可見該方法先於onOptionsItemSelected執行。 3.使用Intent響應菜單第3種方式是直接在MenuItem上調用setIntent(Intent intent)方法,這樣android會自動在該菜單被點擊時調用 startActivity(Intent)。但是個人認為與其這樣還不如直接在onOptionsItemSelected的case裏手動調用 startActivity(Intent)來的直觀。