1. 程式人生 > >Android選單詳解(二)——建立並響應選項選單

Android選單詳解(二)——建立並響應選項選單

今天讓我們看一下如何通過程式碼建立和響應最常用的選項選單(options menu)。

建立options menu

之前提到,Android的activity已經為我們提前建立好了android.view.Menu物件,並提供了回撥方法(Menu menu)供我們初始化選單的內容。該方法只會在選項選單第一次顯示的時候被執行,如果你需要動態改變選項選單的內容,請使用

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // 呼叫父類方法來加入系統選單
    // 雖然目前android還沒有系統選單,但是為了相容到以後的版本,最好加上
super.onCreateOptionsMenu(menu);
   
    // 新增選單項(多種方式)
    // 1.直接指定標題
    menu.add("選單項1");
    // 2.通過資源指定標題
    menu.add(R.string.menuitem2);
    // 3.顯示指定選單項的組號、ID、排序號、標題
    menu.add(  ,        //組號
            Menu.FIRST, //唯一的ID號
            Menu.FIRST, //排序號
    		"選單項3"); //標題
   
    // 如果希望顯示選單,請返回true
return true;
}


上面的程式碼演示了新增選單項的3種方法,下面解釋下第三種方法
add(int groupId, int itemId, int order,CharSequence title)。其中,第一個引數是組號,android中你可以給選單分組,以便快速地操作同一組的選單。第二個引數指定每個選單項的唯一ID號,你可以自己指定,也可以讓系統來自動分配,在響應選單時你需要通過ID號來判斷哪個選單被點選了。因此常規的做法是定義一些ID常量,但在android中有更好的方法,就是通過資原始檔來引用,這個之後介紹。第三個引數代表選單項顯示順序的編號,編號小的顯示在前面。

給選單項分組

@Override
publicboolean 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類的 回撥方法,每當有選單項被點選時,android就會呼叫該方法,並傳入被點選選單項。

@Override
publicboolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    //響應每個選單項(通過選單項的ID)
case1:
        // do something here
break;
    case2:
        // do something here
break;
    case3:
        // do something here
break;
    case4:
        // do something here
break;
    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(MenuItemitem)回撥方法的說明是"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上呼叫(Intent intent)方法,這樣android會自動在該選單被點選時呼叫 。但是個人認為與其這樣還不如直接在onOptionsItemSelected的case裡手動呼叫來的直觀。