options menu:
按MENU键来显示, 在屏幕最下面最多显示6个菜单选项(icon menu,不可以有checkable),如果多于6个的其他的会以“more” icon menu来调出(expanded menu)。
通过activity的onCreateOptionsMenu 来生成,
只能在menu第一次生成时调用;想改变options menu,
只能在onPrepareOptionsMenu 里来实现;处理 options menu 里菜单项,
要用activity的onOptionsItemSelected 来实现。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, MENU_ITEM_DELETE_ALL, 0, R.string.recentCalls_deleteAll)
.setIcon(android.R.drawable.ic_menu_close_clear_cancel);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()){
case MENU_ITEM_DELETE_ALL:
showDialog(DIALOG_DELETE_ALL);
break;
}
return super.onMenuItemSelected(featureId, item);
}
这个为最简单的OptionsMenu的实现
context menu:
在view上需要按上2s显示,与某个view绑定在一起,
在activity的onCreate里使用registerForContextMenu(getListView()) 为view注册context menu,
菜单的实现由在activity的onCreateContextMenu 来完成。
在activity的onContextItemSelected 完成选中菜单的处理。
为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和 onContextItemSelected()。在回调函数onCreateContextMenu()里,你可以通过使用一个add()方法来添加菜 单项,或者通过扩充一个定义在XML中的菜单资源。然后,通过registerForContextMenu()为这个视图注册一个上下文菜单 ContextMenu.
比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfoIn ) {
super.onCreateContextMenu(menu, v, menuInfoIn);
//AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) menuInfoIn;
//Cursor cursor = (Cursor) mAdapter.getItem(menuInfo.position);
menu.add(0, EDIT_ID, 0, "Edit");
menu.add(0, DELETE_ID, 0, "Delete");
}
public boolean onContextItemSelected(MenuItem item ) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case EDIT_ID:
editNote(info.id);
return true;
case DELETE_ID:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
在 onCreateContextMenu()中,除了给出将添加MenuItems的ContextMenu外,还需要给定选中的视图和一个上下文菜单信 息ContextMenuInfo对象,该对象提供了选中对象的附加信息。在本例中,onCreateContextMenu()没做什么特别的事-只是 添加了一些菜单项。在onContextItemSelected() 回调函数中,我们从MenuItem中请求 AdapterContextMenuInfo,该对象提供当前选中项的信息。我们从中所要的只是这个选中项的列表ID,所以无论编辑还是删除一个注释, 我们通过这个对象的AdapterContextMenuInfo.info字段来找到该ID。这个ID被传递给editNote() 和 deleteNote()方法来执行相应的动作。
现在,要为一个列表视图中的所有项注册上下文菜单,我们可以传递整个的列表视图对象给registerForContextMenu(View) 方法:
registerForContextMenu(getListView());
记住,你可以传递任何视图对象来注册一个上下文菜单。这里,getListView()返回这个被用于Notepad应用程序的列表活动ListActivity中的列表视图对象。这样,这个列表中的任何item都被注册到这个上下文菜单。