目录(?)[-]

  1. 什么是Context menu
  2. 注册View带有Context menu
  3. 填Context菜单内容
  4. Context菜单点击触发

什么是Context menu

在桌面电脑,我们都很熟悉Context menu,按鼠标右键显示的菜单就是context菜单。在Android中,通过长时间鼠标按键可以触发context菜单。对于触屏设备,手指长按就是长鼠标按键事件。

一个activity有一个且只能有一个OptionMenu,一个view可以有一个且最多只能有一个ContextMenu。检查鼠标长按是基于view来监听。因此一个activity中可有多少个view,就可以有多少个ContextMenu。

注册View带有Context menu

如果某个view带有Context menu,需要先在onCreate()中注册,代码如下

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.pure_text); 
    //小例子中只有一个全屏的TextView 
    infoTv = (TextView)findViewById(R.id.pureInfo); 
    //【步骤1】:在onCreate()中为view注册context菜单
    registerForContextMenu
(infoTv); 
}

填Context菜单内容

注册之后,我们要具体编写菜单项,将重写onCreateContextMenu(),例子代码如下:

private static int TV_CONTEXTMENU_BASE =  1000;
//第一个参数是预构的ContextMenu对象,第二个参数是所注册的view,第三个参数一般我们不使用,但是有时view需要需要通过该参数传递信息。ContextMenuInfo是接口,实现的类有AdapterContextMenuInfo和ExpandableContextMenu。如果传递的信息和cursor有关,可以使用AdapterContextMenuInfo来传递rowId。
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
   //设置标题图标和标题,并添加两个菜单项 
    menu.setHeaderIcon(R.drawable.leaf); 
    menu.setHeaderTitle("Context Menu :"); 
    menu.add(Menu.NONETV_CONTEXTMENU_BASE,TV_CONTEXTMENU_BASE, "item.1");
    menu.add(Menu.NONETV_CONTEXTMENU_BASE + 1,TV_CONTEXTMENU_BASE + 1,"item.2");

//子菜单嵌套测试 
    SubMenu subMenu = menu.addSubMenu("子菜单"); 
    subMenu.setHeaderIcon(R.drawable.clock); 
    subMenu.add(Menu.NONE,TV_CONTEXTMENU_BASE + 100, + TV_CONTEXTMENU_BASE + 100,"sub.1");
    subMenu.add(Menu.NONE,TV_CONTEXTMENU_BASE + 101, + TV_CONTEXTMENU_BASE + 101,"sub.2");
}

ContextMenu和OptionMenu在初始化中是有区别的,OptionMenu是在Activity创建时进行的,而ContextMenu则是每次长按鼠标事件时触发的。对于同一个view,每次长按键都会调用onCreateContextMenu()。经过跟踪,每次返回新的ContextMenu对象,也就是ContextMenu是实时创建的,这点要注意。

Context菜单点击触发

ContextMenu是Menu接口的实现,触发机制非常相似。例子代码如下:

@Override 
public boolean onContextItemSelected(MenuItem item) {  
    if(item.getItemId() == TV_CONTEXTMENU_BASE){ 
        showInfo("item.1 was clicked "); 
    }else{ 
        showInfo("ItemId " + item.getItemId() + " has nothing done");
    } 
    return super.onContextItemSelected(item); 
}

本博文涉及的例子代码,可以在Pro Android学习:Menu中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(三二):Menu(3):Context菜单的更多相关文章

  1. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  2. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  3. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  4. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  5. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  6. 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout

    相对布局:RelativeLayout RelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置.缺省控件的位置为最 ...

  7. 【转】 Pro Android学习笔记(二一):用户界面和控制(9):Gallery和SimpleAdapter

    Gallery画廊式控件,如图所示,但是在API level 16,也即Android 4.1,被deprecated,可以使用HorizontableScroolView和ViewPager.但是后 ...

  8. 【转】Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme

    目录(?)[-] 静态格式 代码中设定 Style Theme 静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u& ...

  9. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  10. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu

    目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...

随机推荐

  1. 【学员管理系统】0x04 数据库连接优化

    [学员管理系统]0x04  pymysql数据库连接优化 写在前面 项目详细需求参见:Django项目之[学员管理系统] 优化实现 把操作封装成函数 我们之前使用pymysql操作数据库的操作都是写死 ...

  2. Java语言实现简单FTP软件------>远程文件管理模块的实现(十)

    首先看一下界面: 1.远程FTP服务器端的文件列表的显示 将远程的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改 ...

  3. KinedEditor特性

    谷歌浏览器会将kindeditor在其他js文件加载完之后加载 kindeditor是异步加载,document.ready完了,kindeditor可能还没加载完 kind会将选区变成一个节点 1. ...

  4. 3.26课·········window.document对象

    1.Window.document对象 一.找到元素:    docunment.getElementById("id"):根据id找,最多找一个:    var a =docun ...

  5. C#转换人民币大写金额

    /// <summary> /// 转换人民币大写金额. /// </summary> public class RMBConverter { /// <summary& ...

  6. Redis高级进阶(一)

    一.redis中的事务 在关系型数据库中事务是必不可少的一个核心功能,生活中也是处处可见,比如我们去银行转账,首先需要将A账户的钱划走,然后存到B账户上,这两个步骤必须在同一事务中,要么都执行,要么都 ...

  7. 字典树 HDU 1075 What Are You Talking About

    http://acm.hdu.edu.cn/showproblem.php?pid=1075 ;}

  8. poj 2251 Dungeon Master-搜索进阶-暑假集训

    普及一下知识 s.empty() 如果栈为空返回true,否则返回falses.size() 返回栈中元素的个数s.pop() 删除栈顶元素但不返回其值s.top() 返回栈顶的元素,但不删除该元素s ...

  9. TMS Scripter importtool的使用

    uses ap_DateUtils; showmessage(dayof(now)); //注册delphi对象或变量 : IDEScripter1   IDEScripter1.AddConstan ...

  10. virtualbox 相关操作

    关闭 vboxmanage controlvm nenew poweroff 打开,后台运行 vboxmanage startvm centos0 --type headless 复制虚拟机镜像VBo ...