android菜單詳解二:選項菜單 – Android移動開發技術文章_手機開發 Android移動開發教學課程

創建一個選項菜單

選項菜單裡應該包含基本的activity動作和必須的導航條目 (例如,一個打開程序設置的菜單項). 選項菜單的菜單項有兩種不同的選擇方法,一是菜單項按鈕,二是通過 Action Bar (在Android 3.0及以上版本中).

 
 

圖1:瀏覽器中的選項菜單

 
 

圖 2. Email程序中的動作欄,具有兩個動作和一個溢出菜單

 

當 運行於Android 2.3及更低版本時,選項菜單出現在屏幕的底部,見圖1.當打開選項菜單時,首先映入眼簾的是圖標菜單,它有六個菜單項,如果你加入瞭多於六個菜單項,系 統會把第六個菜單項和後面的菜單項放到溢出菜單中,用戶可以通過 "More"菜單項打開它們.

Android 3.0及以後版本中,選項菜單項被放在Action Bar上.Action Bar位於Activity的頂部傳統的Title bar所在的位置.默認情況下,所有的來自選項菜單的菜單項都衣放入溢出菜單中.用戶可以觸擊Action bar右邊的菜單圖標以打開之.但是,你也可以把菜單項作為"action items"直接放到 Action Bar上 ,像圖2所示那樣.

當系統第一次創建選項菜單時,它調用你的activity的方法 onCreateOptionsMenu() . 重寫這個方法並且為傳入的參數 Menu 創建實例.Menu 是通過inflate一個菜單資源創建的,如下:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.game_menu, menu); 
    return true; 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}你也可以在代碼中產生menu,然後使用方法 add() 添加菜單項.

註意:在Android 2.3 及更低版本中,當用戶第一次打開選項菜單時系統調用 onCreateOptionsMenu() 創建選項菜單,但是在Android 3.0及更高版本中, 系統在Activity一創建時就創建選項菜單,為的是創建Action Bar.

 

響應用戶動作


當用戶選擇一個菜單項 (也包括Action Bar上的動作項), 系統會調用你的activity的方法 onOptionsItemSelected() .這個方法會在參數中傳入選擇的菜單項.你可以通過調用方法getItemId()定位這個菜單項 ,這個方法會返回菜單項的唯一ID (在菜單資源文件中以android:id屬性定義或在調用方法add()時傳入的整數). 你可以使用已知的菜單項來匹配這個ID並執行相關的動作,例如:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection  
    switch (item.getItemId()) { 
    case R.id.new_game: 
        newGame(); 
        return true; 
    case R.id.help: 
        showHelp(); 
        return true; 
    default: 
        return super.onOptionsItemSelected(item); 
    } 

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.new_game:
        newGame();
        return true;
    case R.id.help:
        showHelp();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}在 這個例子中, getItemId() 獲取所選菜單項的ID並在switch語句中與資源文件中所有菜單ID比較。當switch語句中成功處理瞭菜單項,就返回 true 以表明所選 的菜單項被處理瞭。否則,default 語句會把菜單項傳給父類,也許父類會處理這個菜單項 (如果你直接從 Activity派生,那麼父類會返回false, 但是把未處理的菜單項傳給父類而不是直接返回false是一個好習慣.)

另外, Android 3.0 增加瞭在菜單資源XML文件中定義菜單項的點擊行為的能力,這個能力通過 android:onClick 屬性定義 。所以你不需要實現 onOptionsItemSelected(). 使用 android:onClick 屬性,你可以指定一個方法在菜單項被選擇時調用. 你的 activity 必須實現在屬性android:onClick中指定的方法,它接受一個MenuItem 參數—當系統調用這個方法時選中的菜單從這個參數傳入。

小 技巧:如果你的程序中包含多個 activitie並且它們提供相同的選項菜單,應考慮創建一個隻實現瞭 onCreateOptionsMenu() 和 onOptionsItemSelected()的activity 類,然後讓那些提供相同選項菜單的activity都從這個類派生.通過這種方式,你隻需為這個類的子孫們管理一組代碼。

如果你想在孫子 activitie們中添加菜單項,隻需重寫 onCreateOptionsMenu(). 在其中調用 super.onCreateOptionsMenu(menu) ,於是原始的菜單被創建,然後通過方法menu.add()添加新菜單項。你也可以重寫父類的方法來創建另外的菜單項們。

 

在運行時改變菜單項們www.aiwalls.com


一旦activity被創建,方法onCreateOptionsMenu() 隻會被調用一次(前面已經說過).系統會保存並重用這個菜單,直到你的activity被銷毀.如果你想在菜單創建後再去改變它怎麼辦呢?你必須重寫方法 onPrepareOptionsMenu() . 它會傳給你已創建的菜單的實例.在你想跟據應用的狀態刪除,添加,disable, or enable菜單項們的時候就用到這個函數瞭.

在 Android 2.3和其之前的版本,系統在每次打開選項菜單時都會調用 onPrepareOptionsMenu() .

在 Android 3.0 及以後版本中,你必須在你想更新菜單之前主動調用方法 invalidateOptionsMenu() , 因為菜單是一直打開的.系統之後會調用onPrepareOptionsMenu() ,於是你就可以更改菜單項瞭.

註: 你永遠不要更改當前具有焦點的View的選項菜單.當處於觸摸模式 (用戶沒有使用軌跡球或方向鍵), views不能取得焦點,所以你永遠不能基於焦點來修改選項菜單的菜單項目. 如果你想為View提供上下文敏感的菜單項,使用 Context Menu.

如果你正在開發 Android 3.0 或更高版本之上的應用,還需閱讀 Action Bar 的開發指南.

 

摘自 nkmnkm的專欄

發佈留言