android菜單詳解三:上下文菜單 – Android移動開發技術文章_手機開發 Android移動開發教學課程

創建一個上下文菜單

一個上下文菜單跟PC上的右鍵菜單類似.你應使用上下文菜單為用戶界面上的某個部分提供動作選擇功能.在Android中,一個上下文菜單會在用戶長按一個界面條目時出現.

你可以為任何View創建上下文菜單,但是在 ListView中是最常用到上下文菜單的.每當用戶在一個ListView項上長按,並且這個ListView註冊瞭上下文菜單,那麼被按的 list item就會彈出上下文菜單 (在聯系人應用中就演示瞭這個過程).
Register a ListView

如果你的activity使用一個ListView並且你希望所有的list items都提供一個上下文菜單,應把ListView傳給方法registerForContextMenu(),例如:

registerForContextMenu(getListView());

為瞭使view提供上下文菜單,你必須為這個View向系統註冊上下文菜單.調用方法 registerForContextMenu() 並傳入要彈出菜單的 View 作為參數即可.當這個View被長按時,它就會顯示一個上下文菜單.

為瞭定義上下文菜單的樣子和行為,需重寫你的activity的上下文菜單回調方法:onCreateContextMenu() 和onContextItemSelected().

例如,下面是一個 onCreateContextMenu() ,使用瞭資源文件 context_menu.xml :

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
                                ContextMenuInfo menuInfo) { 
  super.onCreateContextMenu(menu, v, menuInfo); 
  MenuInflater inflater = getMenuInflater(); 
  inflater.inflate(R.menu.context_menu, menu); 

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.context_menu, menu);
}MenuInflater 被用於從一個 菜單資源inflate出一個菜單. (你也可以使用 add() 來添加菜單項們) .回調函數的參數中包含瞭用戶所選擇的View 和一個ontextMenu.ContextMenuInfo 對象,它可以提供被選擇的View的更多的信息.你可以使用這些參數來決定哪個上下文菜單應被創建.但是在這個例子中,Activity所有的上下文菜單都是相同的.

然後,當用戶從上下文菜單選擇一個菜單項時,系統會調用方法 onContextItemSelected(). 下面的例子展示瞭如何處理被選擇的菜單項: www.aiwalls.com

@Override 
public boolean onContextItemSelected(MenuItem item) { 
  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
  switch (item.getItemId()) { 
  case R.id.edit: 
    editNote(info.id); 
    return true; 
  case R.id.delete: 
    deleteNote(info.id); 
    return true; 
  default: 
    return super.onContextItemSelected(item); 
  } 

@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  switch (item.getItemId()) {
  case R.id.edit:
    editNote(info.id);
    return true;
  case R.id.delete:
    deleteNote(info.id);
    return true;
  default:
    return super.onContextItemSelected(item);
  }
}這些代碼與選項菜單中的例子代碼基本相同.getItemId() 從所選的菜單項獲取菜單ID,並且使用switch語句匹配菜單ID與對應的處理.並且同於選項菜單的例子,default語句調用父類的同一方法處理未被我們處理的菜單項.

在此例中,被選擇的View條目是一個 ListView條目.為瞭在選擇的一個view條目上執行相應的動作,應用程序需要知道View條目的list ID.為瞭獲得 list ID,程序中調用瞭 getMenuInfo(), 它返回一個 AdapterView.AdapterContextMenuInfo 對象,這個對象包含瞭條目的list ID.本地方法editNote()和deleteNote()接受這個list ID用於執行一些作.


註: 上下文菜單項不支持圖標或快捷鍵.

 

摘自 nkmnkm的專欄
 

發佈留言