>> 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
儘管上下文菜單的擁有者是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(...)中響應上下文菜單項。
菜單
/**
* 上下文菜單演示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");
}
}
在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, "刪除");
}
與響應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每一次都被調用了。