創建一個選項菜單
選項菜單裡應該包含基本的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的專欄