Android Menu介绍

轩辕成天
2023-12-01

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都被注册到这个上下文菜单。

 类似资料: