当前位置:操作系统 > 安卓/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.zzzyk.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的专栏
 

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,