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

分类:Android 147人阅读 评论(0) 收藏 举报 android ContextMenu Options

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

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

(1)registerForContextMenu(getExpandableListView());

(2)onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);

(3)onContextItemSelected(MenuItem item);


>>ContextMenu和OptionsMenu相比主要有以下区别: 1,ContextMenu必须通过Activity的 registerForContextMenu(View)来进行注册,而OptionsMenu不用。 2,ContextMenu不支持icon,而OptionsMenu支持。 3,ContextMenu可以有头,可以通过setHeaderIcon,setHeaderTitle,setHeaderView来设置头,否则就没有头。 4,弹出的方式不一样。 5, Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View 。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们 调用 registerForContextMenu ( View view) 来指定
注意事项:ContextMenu的任何项在被选中后,整个ContextMenu会自动被系统关闭掉,即使多选项也是这样。这样的话,多选项的行为就有些怪异。查看Android的源码后,发现这是个Android的bug,应该是google没考虑多选项的情况。

尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo)方法,该方法很像生成Options Menu的onCreateOptionsMenu(Menumenu)方法。两者的不同在于,onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。

另一个值得注意的就是上图中的ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

下面的例子是使用菜单(menu)资源,当然有两种方式,第一种是在布局文件中定义,另一种是在代码中实现。下面先说第一种。

项目截图:


1.实现ContextMenu(上下文菜单)

a)首先在布局文件main.xml中定义一个TextView,作为菜单 测试资源

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6. <TextView
  7. android:id="@+id/textview"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="测试菜单资源"/>
  11. </LinearLayout>
b).在res/menu目录下面创建文件菜单资源file_menu.xml

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <menuxmlns:android="http://schemas.android.com/apk/res/android">
  3. <item
  4. android:title="File"
  5. >
  6. <menu>
  7. <group
  8. android:id="@+id/noncheckable_group"
  9. android:checkableBehavior="none"
  10. >
  11. <item
  12. android:id="@+id/newFile"
  13. android:title="New"
  14. android:alphabeticShortcut="n"
  15. />
  16. <item
  17. android:id="@+id/openFile"
  18. android:title="Open"
  19. android:alphabeticShortcut="o"
  20. />
  21. <item
  22. android:id="@+id/saveFile"
  23. android:title="Save"
  24. android:alphabeticShortcut="s"
  25. />
  26. </group>
  27. </menu>
  28. </item>
  29. <item
  30. android:title="Edit"
  31. >
  32. <menu>
  33. <group
  34. android:id="@+id/edit_group"
  35. android:checkableBehavior="single"
  36. >
  37. <item
  38. android:id="@+id/cut"
  39. android:title="Cut"
  40. />
  41. <item
  42. android:id="@+id/copy"
  43. android:title="Copy"
  44. />
  45. <item
  46. android:id="@+id/past"
  47. android:title="paste"
  48. />
  49. </group>
  50. </menu>
  51. </item>
  52. <itemandroid:title="Help"
  53. >
  54. <menu>
  55. <group
  56. android:id="@+id/help_group"
  57. >
  58. <item
  59. android:id="@+id/about"
  60. android:title="About"
  61. />
  62. <item
  63. android:id="@+id/exit"
  64. android:title="Exit"
  65. />
  66. </group>
  67. </menu>
  68. </item>
  69. </menu>
c)在Activity中实现ContextMenu,按照前面的理论指导,代码实现如下:

[java] view plain copy print ?
  1. packagecom.xzy.menu.demo;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.content.DialogInterface;
  5. importandroid.os.Bundle;
  6. importandroid.view.ContextMenu;
  7. importandroid.view.Menu;
  8. importandroid.view.MenuInflater;
  9. importandroid.view.MenuItem;
  10. importandroid.view.View;
  11. importandroid.view.ContextMenu.ContextMenuInfo;
  12. importandroid.widget.TextView;
  13. publicclassTestMenuActivityextendsActivity{
  14. privateMenuInflatermi;
  15. privateTextViewtextview;
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. textview=(TextView)findViewById(R.id.textview);
  21. registerForContextMenu(textview);//上下文菜单必需使用该方法注册
  22. }
  23. @Override
  24. publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  25. ContextMenuInfomenuInfo){
  26. //TODOAuto-generatedmethodstub
  27. mi=newMenuInflater(this);
  28. mi.inflate(R.menu.file_menu,menu);
  29. }
  30. @Override
  31. //菜单项的单击事件
  32. publicbooleanonContextItemSelected(MenuItemitem){
  33. switch(item.getItemId()){
  34. caseR.id.about:
  35. aboutAlert("本实例演示的是如何使用xml菜单资源来定义菜单!");
  36. break;
  37. caseR.id.exit:
  38. exitAlert("真的要退出么?");
  39. break;
  40. }
  41. returntrue;
  42. }
  43. //显示对话框
  44. privatevoidexitAlert(Stringmsg){
  45. //实例化AlertDialog.Builder
  46. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  47. //设置显示信息
  48. builder.setMessage(msg).setCancelable(false)
  49. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  50. publicvoidonClick(DialogInterfacedialog,intwhich){
  51. //结束activity
  52. finish();
  53. }
  54. //取消按钮
  55. })
  56. .setNegativeButton("取消",newDialogInterface.OnClickListener(){
  57. publicvoidonClick(DialogInterfacedialog,intid){
  58. return;
  59. }
  60. });
  61. //创建对话框
  62. AlertDialogalert=builder.create();
  63. //显示对话框
  64. alert.show();
  65. }
  66. //显示对话框
  67. privatevoidaboutAlert(Stringmsg){
  68. //实例化AlertDialog.Builder
  69. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  70. //设置显示信息
  71. builder.setMessage(msg).setCancelable(false)
  72. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  73. publicvoidonClick(DialogInterfacedialog,intwhich){
  74. }
  75. });
  76. //创建对话框
  77. AlertDialogalert=builder.create();
  78. //显示对话框
  79. alert.show();
  80. }
  81. }

此时运行程序,长按文本内容就可以呼出上下文菜单。效果如图:

2.实现OptionsMenu(子菜单)的话,需要重写下面的几个方法,而且此时不需要注册。用手机系统按键呼出

前面定义的布局文件不需要改动,java代码如下:

[java] view plain copy print ?
  1. packagecom.xzy.menu.demo;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.content.DialogInterface;
  5. importandroid.os.Bundle;
  6. importandroid.view.ContextMenu;
  7. importandroid.view.Menu;
  8. importandroid.view.MenuInflater;
  9. importandroid.view.MenuItem;
  10. importandroid.view.View;
  11. importandroid.view.ContextMenu.ContextMenuInfo;
  12. importandroid.widget.TextView;
  13. publicclassTestMenuActivityextendsActivity{
  14. privateMenuInflatermi;
  15. @Override
  16. publicvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main);
  19. }
  20. //覆盖Activity的onCreateOptionsMenu()方法,在其中创建菜单
  21. publicbooleanonCreateOptionsMenu(Menumenu){
  22. //调用MenuInflater的inflate方法,通过配置文件创建菜单
  23. mi=newMenuInflater(this);
  24. mi.inflate(R.menu.file_menu,menu);
  25. returntrue;
  26. }
  27. @Override
  28. //菜单项的单击事件
  29. publicbooleanonOptionsItemSelected(MenuItemitem){
  30. switch(item.getItemId()){
  31. caseR.id.about:
  32. aboutAlert("本实例演示的是如何使用xml菜单资源来定义菜单!");
  33. break;
  34. caseR.id.exit:
  35. exitAlert("真的要退出么?");
  36. break;
  37. }
  38. returntrue;
  39. }
  40. //显示对话框
  41. privatevoidexitAlert(Stringmsg){
  42. //实例化AlertDialog.Builder
  43. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  44. //设置显示信息
  45. builder.setMessage(msg).setCancelable(false)
  46. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  47. publicvoidonClick(DialogInterfacedialog,intwhich){
  48. //结束activity
  49. finish();
  50. }
  51. //取消按钮
  52. })
  53. .setNegativeButton("取消",newDialogInterface.OnClickListener(){
  54. publicvoidonClick(DialogInterfacedialog,intid){
  55. return;
  56. }
  57. });
  58. //创建对话框
  59. AlertDialogalert=builder.create();
  60. //显示对话框
  61. alert.show();
  62. }
  63. //显示对话框
  64. privatevoidaboutAlert(Stringmsg){
  65. //实例化AlertDialog.Builder
  66. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  67. //设置显示信息
  68. builder.setMessage(msg).setCancelable(false)
  69. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  70. publicvoidonClick(DialogInterfacedialog,intwhich){
  71. }
  72. });
  73. //创建对话框
  74. AlertDialogalert=builder.create();
  75. //显示对话框
  76. alert.show();
  77. }
  78. }

子菜单效果图:



用java代码实现的例子:

参见博文:http://blog.csdn.net/pfgmylove/article/details/7560290?reload

分享到:

更多相关文章

  1. Android实现导航菜单左右滑动效果
  2. Android(安卓)系统菜单与自定义菜单
  3. android 对话框AlertDialog
  4. GridView做所有程序主菜单
  5. android弹出对话框大全
  6. Android使用DialogFragment,自定义对话框
  7. Android中动态添加╱删除的Spinner菜单
  8. android material design 军火库 控件
  9. android开发之res下的menu (xml+代码的形式)

随机推荐

  1. android GOOGLE MAP应用
  2. 新版 Android(安卓)Studio 编译输出中文
  3. Android——禁止设备休眠
  4. Android(安卓)仿秒拍,微信录制短视频
  5. 去掉android的屏幕上的title bar
  6. Android中使用log4j
  7. Android(安卓)API 中文 (52) ―― ZoomButt
  8. android 圆角和阴影效果
  9. Android(安卓)点击事件分发
  10. Android(安卓)USB/MTP相关实现