ContextMenu是Android的context menu上下文菜单,选择某项VIEW后长按menu键,就会显示出来。比如EditeText就可以通过长按来弹出拥有“cut”,“copy”,"paste"等项的ContextMenu。

#实现ContextMenu,一般要用到以下三个方法:

  • registerForContextMenu(getExpandableListView());

  • onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);
    尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,该方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。两者的不同在于,onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单
    另一个值得注意的就的ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象

  • onContextItemSelected(MenuItem item);

ContextMenu和OptionsMenu相比主要有以下区别

  1. 1 ContextMenu必须通过Activity的registerForContextMenu(View)来进行注册,而OptionsMenu不用。
  2. ContextMenu不支持icon,而OptionsMenu支持。
  3. ContextMenu可以有头,可以通过setHeaderIcon,setHeaderTitle,setHeaderView来设置头,否则就没有头。
  4. 弹出的方式不一样。
  5. OptionsMenu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们调用registerForContextMenu(View view)来指定。

#注意事项
ContextMenu的任何项在被选中后,整个ContextMenu会自动被系统关闭掉,即使多选项也是这样。这样的话,多选项的行为就有些怪异。查看Android的源码后,发现这是个Android的bug,应该是google没考虑多选项的情况。

示例

创建一个上下文菜单的步骤:

  1. 覆盖 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。
  2. 覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。
  3. 调用 registerForContextMenu() 方法,为视图注册上下文菜单。
//file name: MainActivity.java
package hi.braincol.local.contextMenu;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.util.Log;
public class MainActivity extends ListActivity {  private static final int ITEM1 = Menu.FIRST;  private static final int ITEM2 = Menu.FIRST+1;  private static final int ITEM3 = Menu.FIRST+2;  /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);     showListView();  //为 ListView 的所有 item 注册 ContextMenu  registerForContextMenu(getListView());  //这里的registerForContextMenu()也可以用下面的语句替代  //getListView().setOnCreateContextMenuListener(this);  }  private void showListView(){  String[] mString = new String[]{  "路飞-Monkey D Luffy",   "奈美-Nami",   "卓洛-Zoro",  "山治-Sanji",   "尼可·罗宾-Ms. All Sunday",   "乌索普-usoppu",   "托尼托尼·乔巴-Tony Tony Chopper",  };  ArrayAdapter<String> mla = new ArrayAdapter<String>(MainActivity.this,   R.layout.main, mString);  MainActivity.this.setListAdapter(mla);        }  //上下文菜单,本例会通过长按条目激活上下文菜单  @Override public void onCreateContextMenu(ContextMenu menu, View view,   ContextMenuInfo menuInfo) {  menu.setHeaderTitle("人物简介");  //添加菜单项  menu.add(0, ITEM1, 0, "特长");  menu.add(0, ITEM2, 0, "战斗力");  menu.add(0, ITEM3, 0, "经典语录");  }  //菜单单击响应  @Override public boolean onContextItemSelected(MenuItem item){  //获取当前被选择的菜单项的信息  //AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();  //Log.i("braincol",String.valueOf(info.id));          switch(item.getItemId()){  case ITEM1:  //在这里添加处理代码  break;  case ITEM2:  //在这里添加处理代码  break;      case ITEM3:  //在这里添加处理代码  break;  }  return true;  }  }

(4.0.15.3)Android 的上下文菜单: ContextMenu的使用方法以及与OptionMenu的区别相关推荐

  1. android 使用上下文菜单ContextMenu

    Android 的上下文菜单类似于 PC 上的右键菜单.当为一个视图注册了上下文菜单之后,长按这个视图对象就会弹出一个浮动菜单,即上下文菜单.任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图 ...

  2. 【Android】上下文菜单ContextMenu的使用

    上下文菜单 又称长按菜单.当一个视图注册了上下文菜单时,执行一个在该对象上长按(2秒)的动作,将出现一个具有相关功能的浮动菜单. 类概述 扩展自Menu的上下文菜单提供了修改上下文菜单头(header ...

  3. Android之ContextMenu的使用方法以及与OptionMenu的区别

    >> ContextMenu是android的context menu上下文菜单,选择某项VIEW后长按menu键,就会显示出来.比如EditeText就可以通过长按来弹出拥有" ...

  4. Android 的上下文菜单: Context Menu

    本文转载自: https://www.cnblogs.com/hibraincol/archive/2010/09/30/1839014.html 作者:hibraincol 转载请注明该声明. 概述 ...

  5. Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())

    概述: Android 的上下文菜单类似于 PC 上的右键菜单.当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单.任何视图都可以注册上下文菜单,不过, ...

  6. 5.4 Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())

    Android 的上下文菜单: Context Menu,registerForContextMenu(getListView()) Android 的上下文菜单类似于 PC 上的右键菜单.当为一个视 ...

  7. 学习之路(一)Android 的上下文菜单: Context Menu,registerForContextMenu(getListView());

    概述: Android 的上下文菜单类似于 PC 上的右键菜单.当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单.任何视图都可以注册上下文菜单,不过, ...

  8. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  9. android 关闭上下文菜单,【Android笔记】ContextMenu上下文菜单

    ContextMenu上下文菜单 1.ContextMenu菜单的组成部分 标题及标题图标 菜单内容 菜单内容的点击响应事件 2.ContextMenu与OptionMenu的区别 OptionMen ...

最新文章

  1. 让PasswordRecovery控件使用Email地址找回密码
  2. ListView加checkBox可以实现全选等功能
  3. win2012R2打Windows8.1-KB2919355 问题
  4. C#的winform拼数字游戏
  5. 只要300页!火遍全网的NET6+linux知识手册!拿走不谢!
  6. css flexbox模型_完整CSS课程-包括flexbox和CSS网格
  7. 分号不是个“随便的人”
  8. php wula,PHP老师没教过你的那些知识点
  9. 实战干货:基于Redis6.0 部署迷你版本消息队列
  10. RESTful API标准设计教程
  11. Hadoop1.2.1源码解析系列:JT与TT之间的心跳通信机制——命令篇
  12. pythonATM,购物车项目实战3-视图函数
  13. CDH-CM资源下载!!免费!!!
  14. 程序猿崛起2——互联网时代下的新潮流和新活法
  15. mysql添加多字段唯一索引吗_mysql多字段唯一索引
  16. Linux两主机之间快速传输大量小文件
  17. Hexo主题制作指南
  18. HYSBZ 4198 荷马史诗
  19. 线性电源(LDO)原理分析
  20. win10下载安装office2016

热门文章

  1. 我,AI博士生,在线众筹研究主题
  2. 租房N年,整理了这份租房指南,包含租房靠谱APP租房网站和租房注意事项,第一次租房必看租房攻略。
  3. 【NOIP2013模拟】导弹防御塔
  4. Catch2库下载安装
  5. ajax的跨域请求实现,Ajax-07 基于Ajax实现跨域请求(示例代码)
  6. 艾司博讯:拼多多开直通车常见的误区
  7. 开始懂了《大话西游》
  8. 微信小程序-获取不限制的小程序码(二)
  9. 创建uni-app项目及安装scss插件
  10. oppor9的计算机符号,OPPO R9怎么关闭手机按键灯和显示运营商标志 OPPO R9关闭手机按键灯和显示运营商标...