Android之ContextMenu的使用方法以及與OptionMenu的區別(轉)

>> ContextMenu是android的context menu上下文菜單,選擇某項VIEW後長按menu鍵,就會顯示出來。好比EditeText就能夠經過長按來彈出擁有「cut」,"copy","paste"等項的ContextMenu。html

實現ContextMenu,通常要用到如下三個方法:android

(1)registerForContextMenu(getExpandableListView()); app

(2)onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);ide

(3)onContextItemSelected(MenuItem item);this

 

 

>>ContextMenu和OptionsMenu相比主要有如下區別:
1,ContextMenu必須經過Activity的 registerForContextMenu(View)來進行註冊,而OptionsMenu不用。
2,ContextMenu不支持icon,而OptionsMenu支持。
3,ContextMenu能夠有頭,能夠經過setHeaderIcon,setHeaderTitle,setHeaderView來設置頭,不然就沒有頭。
4,彈出的方式不同。
5, Options Menu的擁有者是Activity,而上下文菜單的擁有者是Activity中的View。每一個Activity有且只有一個Options Menu,它爲整個Activity服務。而一個Activity每每有多個View,並非每一個View都有上下文菜單,這就須要咱們 調用 registerForContextMenu(View view)來指定
 
注意事項:ContextMenu的任何項在被選中後,整個ContextMenu會自動被系統關閉掉,即便多選項也是這樣。這樣的話,多選項的行爲就有些怪異。查看Android的源碼後,發現這是個Android的bug,應該是google沒考慮多選項的狀況。

 

 

儘管上下文菜單的擁有者是View,生成上下文菜單倒是經過Activity中的onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,該方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。二者的不一樣在於,onCreateOptionsMenu只在用戶第一次按「Menu」鍵時被調用,而onCreateContextMenu會在用戶每一次長按View時被調用,並且View必須已經註冊了上下文菜單。google

另外一個值得注意的就是上圖中的ContextMenuInfo,該類的對象被傳入onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,那麼它有什麼用呢?有時候,視圖元素須要向上下文菜單傳遞一些信息,好比該View對應DB記錄的ID等,這就要使用ContextMenuInfo。須要傳遞額外信息的View須要重寫getContextMenuInfo()方法,返回一個帶有數據的ContextMenuInfo實現類對象。spa

介紹了這麼多,下面給出一個demo演示如何建立和響應上下文菜單:code

1.在activity的onCreate(...)方法中爲一個view註冊上下文菜單htm

2.在onCreateContextMenuInfo(...)中生成上下文菜單。對象

3.在onContextItemSelected(...)中響應上下文菜單項。

菜單

 

1)註冊上下文菜單

複製代碼
/**
* 上下文菜單演示Demo
*
* @author CodingMyWorld 2011-8-27 下午03:22:39
*/
publicclass SampleContextMenuActivity extends ListActivity {
privatestaticfinal String TAG ="SampleContextMenuActivity";

@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 顯示列表
simpleShowList();
// 爲全部列表項註冊上下文菜單
this.registerForContextMenu(getListView());
}

privatevoid simpleShowList() {
// list item
String[] files =new String[] {
"文件1",
"文件2",
"文件3",
"文件4"
};
// simple array adapter
ArrayAdapter<String> adapter =new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
files);
// set adapter
this.setListAdapter(adapter);
Log.v(TAG, "show simple list");
}
}
複製代碼

 

2)生成上下文菜單

在activity中重寫方法。

複製代碼
@Override
publicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
Log.v(TAG, "populate context menu");
// set context menu title
menu.setHeaderTitle("文件操做");
// add context menu item
menu.add(0, 1, Menu.NONE, "發送");
menu.add(0, 2, Menu.NONE, "標記爲重要");
menu.add(0, 3, Menu.NONE, "重命名");
menu.add(0, 4, Menu.NONE, "刪除");
}
複製代碼

 

3)響應上下文菜單項

與響應options menu相似,惟一的不一樣是能夠經過menu info得到額外的信息。

複製代碼
@Override
publicboolean onContextItemSelected(MenuItem item) {
// 獲得當前被選中的item信息
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
Log.v(TAG, "context item seleted ID="+ menuInfo.id);

switch(item.getItemId()) {
case1:
// do something
break;
case2:
// do something
break;
case3:
// do something
break;
case4:
// do something
break;
default:
returnsuper.onContextItemSelected(item);
}
returntrue;
}
複製代碼

運行程序,屢次喚出上下文菜單,注意LogCat的輸出,onCreateContextMenu每一次都被調用了。

相關文章
相關標籤/搜索