上下文菜单可以和任意View对象进行关联,例如,TextView、EditText、Button等控件都可以关联上下文菜单。上下文菜单的显示效果和子菜单有些类似,也分为菜单头和菜单项。
要想创建上下文菜单,需要覆盖Activity.onCreateContextMenu方法,该方法的定义如下:广州网站建设
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo);
可以使用ContextMenu.setHeaderTitle和ContextMenu.setHeaderIcon方法设置上下文菜单头的标题和图像。上下文菜单项不能带图像,但可以带复选框或选项按钮(这一点和子菜单相同)。上下文菜单与选项菜单一样,也不支持嵌套子菜单。下面的代码创建一个包含4个菜单项的上下文菜单,其中最后一个菜单项包含两个子菜单项。
广州网站建设
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo)
- {
- super.onCreateContextMenu(menu, view, menuInfo);
- menu.setHeaderTitle("上下文菜单");
- menu.setHeaderIcon(R.drawable.face);
- // 添加3个上下文菜单项,Menu.NONE的值是0
- menu.add(0, menuItemId++, Menu.NONE, "菜单项1").setCheckable(true).setChecked(true);
- menu.add(20, menuItemId++, Menu.NONE, "菜单项2");
- // 选中第2个选项按钮
- menu.add(20, menuItemId++, Menu.NONE, "菜单项3").setChecked(true);
- menu.setGroupCheckable(20, true, true);
- // 添加带子菜单的上下文菜单项
- SubMenu sub = menu.addSubMenu(0, menuItemId++, Menu.NONE, "子菜单");
- sub.add("子菜单项1");
- sub.add("子菜单项2");
- }
上下文菜单与其他菜单不同的是必须注册到指定的View上才能显示。注册上下文菜单可以使用Activity.registerForContextMenu方法。下面的代码将当前Activity的上下文菜单注册到Button、EditText和TextView上。广州网站设计
- Button button = (Button) findViewById(R.id.btnAddMenu);
- EditText editText = (EditText) findViewById(R.id.edittext);
- TextView textView = (TextView)findViewById(R.id.textview);
- // 注册上下文菜单
- registerForContextMenu(button);
- registerForContextMenu(editText);
- registerForContextMenu(textView);
当一个控件关联上下文菜单后,长按该控件,等一会就会显示上下文菜单,如运行上面的代码后,长按TextView控件,会显示如图6.6所示的上下文菜单。有一些控件已经有了自己的上下文菜单,例如,EditText,在这种情况下,系统会将我们自定义的上下文菜单项添加到视图自带的上下文菜单项的后面,如图6.7所示。广州网站设计
![]() |
| 图6.6 TextView控件的上下文菜单 |
![]() |
| 图6.7 EditText控件的上下文菜单 |
- public boolean onContextItemSelected(MenuItem item);





