理解Android的菜单


  1. 选项菜单:最常规的菜单,android中把它叫做option menu
  2. 子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
  3. 上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
  4. 图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标
  5. 选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过(其实是我还没弄明白啦o(≧v≦)o~~)
  6. 扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都
为“更多”菜单的子菜单项。如下图作 

    

每个activity包含一个菜单,一个菜单又能包含多个菜单项和多个子菜单,子菜单其实也是菜单(因为它实现了Menu接口),因此子菜单也可以包含多个菜单项。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了两个回调方法,用于创建菜单项和响应菜单项的点击

1,创建options menu 选项菜单

[java] view plain copy
  1. @Override
  2. publicbooleanonCreateOptionsMenu(Menumenu){
  3. //为了兼容以后的版本
  4. super.onCreateOptionsMenu(menu);
  5. //多种方式添加菜单项
  6. //menu.add("菜单项1");//1,直接指定标题,这个响应的时候我不知道怎么调用
  7. //menu.add(R.string.menuitem2);//2,通过资源指定标题
  8. menu.add(1,Menu.FIRST,1,"菜单项1");//3,显式指定菜单项的组号,ID,排序,标题
  9. menu.add(1,Menu.FIRST+1,2,"菜单项2");
  10. menu.add(2,Menu.FIRST+2,3,"菜单项3");
  11. menu.add(2,Menu.FIRST+3,4,"菜单项4");
  12. menu.add(2,Menu.FIRST+4,5,"菜单项5");
  13. menu.add(2,Menu.FIRST+5,6,"菜单项6");//多于6个将会被系统以更多字样替换
  14. menu.add(2,Menu.FIRST+6,7,"菜单项7");
  15. menu.add(2,Menu.FIRST+7,8,"菜单项8");
[java] view plain copy
  1. returntrue;//如果希望现实菜单,返回true

响应菜单项

使用的最多方法是重写activity类的 onOptionsItemSelected(MenuItem) 回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。
以下代码可作为使用onOptionsItemSelected方法响应菜单的模板来使用,这里为了方便起见将菜单ID硬编码在程序里,你可以使用常量或资源ID来使代码更健壮
[java] view plain copy
  1. @Override
  2. publicbooleanonOptionsItemSelected(MenuItemitem){
  3. switch(item.getItemId()){
  4. case1:
  5. //dosomething
  6. Toast.makeText(this,"1",Toast.LENGTH_LONG).show();
  7. break;
  8. case2:
  9. Toast.makeText(this,"2",Toast.LENGTH_LONG).show();
  10. break;
  11. case3:
  12. Toast.makeText(this,"3",Toast.LENGTH_LONG).show();
  13. break;
  14. case4:
  15. Toast.makeText(this,"4",Toast.LENGTH_LONG).show();
  16. break;
  17. default:
  18. returnsuper.onOptionsItemSelected(item);
  19. }
  20. returntrue;
  21. }

使用监听器响应菜单项

虽然上边方法是推荐使用的方法,android还是提供了类似java swing的监听器方式来响应菜单。使用监听器的方式分为两步:

[java] view plain copy
  1. //第一步:为菜单项注册监听器
  2. menuItem.setOnMenuItemClickListener(newMyMenuItemClickListener());
  3. //第二步:创建监听器类
  4. classMyMenuItemClickListenerimplementsOnMenuItemClickListener{
  5. @Override
  6. publicbooleanonMenuItemClick(MenuItemitem){
  7. switch(){
  8. //dosomethinghere...
  9. }
  10. returntrue;//finishhandling
  11. }
  12. }


该方法先于onOptionsItemSelected执行

[java] view plain copy
  1. <h1style="font-family:verdana;"><aname="t4"></a>2,子菜单SubMenu</h1><spanstyle="font-family:verdana;">Android支持子菜单,你可以通过addSubMenu</span><spanstyle="font-family:verdana;">(intgroupId,intitemId,intorder,inttitleRes)方法非常方便的创建和响应子菜单。</span>

[java] view plain copy
  1. @Override
  2. publicbooleanonCreateOptionsMenu(Menumenu){
  3. //为了兼容以后的版本
  4. super.onCreateOptionsMenu(menu);
  5. //添加子菜单
  6. //一个菜单可以有多个子菜单
  7. menu.addSubMenu(1,Menu.FIRST,1,"系统设置");
  8. SubMenusubMenu=menu.addSubMenu(1,Menu.FIRST+1,2,"网络设置");//子菜单支持图标
  9. subMenu.setIcon(R.drawable.ic_launcher);
  10. MenuItemmenuItem=subMenu.add(2,Menu.FIRST+2,Menu.NONE,"菜单项1");//子菜单项不支持显示图标
  11. //menuItem.setIcon(R.drawable.ic_launcher);
  12. subMenu.add(2,Menu.FIRST+3,Menu.NONE,"菜单项2");
  13. subMenu.add(2,Menu.FIRST+4,Menu.NONE,"菜单项3");
  14. subMenu.add(2,Menu.FIRST+5,Menu.NONE,"菜单项4");
  15. returntrue;//如果希望现实菜单,返回true
  16. }


上面的代码演示了如何创建子菜单,其菜单项的响应其实就是普通菜单项的响应

3,图标菜单Icon Menu

Android支持在菜单上显示各种各样的图标,这一点我们在上面创建子菜单时已经用到了

[java] view plain copy
  1. SubMenusubMenu=menu.addSubMenu(1,Menu.FIRST+1,2,"网络设置");//子菜单支持图标
  2. subMenu.setIcon(R.drawable.ic_launcher);

Android中并不是所谓的菜单项都能加上图标,以下菜单项都是不可以的(这并不意味着程序会报错,而是运行时图标得不到显示):

  • 扩展的菜单项。
  • 子菜单的菜单项
  • 上下文菜单的菜单项

4,ContextMenu简介

在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重名名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单.
android是通过长按某个视图元素来弹出上下文菜单的. 上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过 registerForContextMenu(Viewview)来指定。

下面给出一个demo演示如何创建和响应上下文菜单:

1.在activity的onCreate(...)方法中为一个view注册上下文菜单

2.在onCreateContextMenuInfo(...)中生成上下文菜单。

3.在onContextItemSelected(...)中响应上下文菜单项。



[java] view plain copy
  1. publicclassMenuDemoActivityextendsActivity{
  2. privateListViewlistView;
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. initView();//做一些初始化工作
  8. }
  9. privatevoidinitView(){
  10. listView=(ListView)this.findViewById(R.id.listview);
  11. listView.setAdapter(newMyAdapter());
  12. this.registerForContextMenu(listView);//1为所有列表项注册上下文菜单,注意和响应事件不一样
  13. }
  14. //给ListView提供一些数据
  15. privateclassMyAdapterextendsBaseAdapter{
  16. publicintgetCount(){
  17. return5;
  18. }
  19. publicObjectgetItem(intposition){
  20. //TODOAuto-generatedmethodstub
  21. returnnull;
  22. }
  23. publiclonggetItemId(intposition){
  24. //TODOAuto-generatedmethodstub
  25. return0;
  26. }
  27. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  28. TextViewtv=newTextView(MenuDemoActivity.this);
  29. tv.setText("文件"+position);
  30. returntv;
  31. }
  32. }
  33. @Override
  34. //2创建上下文菜单
  35. publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  36. ContextMenuInfomenuInfo){
  37. super.onCreateContextMenu(menu,v,menuInfo);
  38. menu.setHeaderTitle("文件操作");
  39. menu.add(1,Menu.FIRST,Menu.NONE,"发送");
  40. menu.add(1,Menu.FIRST+1,Menu.NONE,"标记为重要");
  41. menu.add(1,Menu.FIRST+2,Menu.NONE,"重命名");
  42. menu.add(1,Menu.FIRST+3,Menu.NONE,"删除");
  43. }
  44. @Override
  45. //3响应上下文菜单
  46. publicbooleanonContextItemSelected(MenuItemitem){
  47. switch(item.getItemId()){
  48. case1:
  49. Toast.makeText(this,"发送",1).show();
  50. break;
  51. case2:
  52. Toast.makeText(this,"标记为重要",1).show();
  53. break;
  54. case3:
  55. Toast.makeText(this,"重命名",1).show();
  56. break;
  57. case4:
  58. Toast.makeText(this,"删除",1).show();
  59. break;
  60. default:
  61. returnsuper.onContextItemSelected(item);
  62. }
  63. returntrue;
  64. }
  65. }
运行程序,多次调出上下文菜单,注意LogCat的输出, onCreateContextMenu每一次都被调用了。
参考http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html

更多相关文章

  1. 【Android(安卓)UI设计与开发】之具体解释ActionBar的使用
  2. Android(安卓)Launcher3主菜单背景改为黑色
  3. Android菜单详解(二)——创建并响应选项菜单
  4. Android---网络编程之OkHttp3整体结构了解以及使用
  5. Android增大button响应区域
  6. android对话框的使用
  7. 在Eclipse中进行Android单元测试
  8. 在Eclipse中进行Android单元测试
  9. Android菜单详解(一)——理解Android中的Menu

随机推荐

  1. android开关飞行模式的方法
  2. Android(安卓)屏幕适配:各种解决方案
  3. android Timer的用法实例
  4. 解决ScrollView中填充内容上下会有阴影的
  5. 【Android休眠】之Android对PowerKey事件
  6. Android(安卓)TabActivity中的子Tab Acti
  7. Android(安卓)Studio JNI开发入门教程
  8. Android Q访问公共外部存储受限
  9. Android(安卓)运行时改变 Drawable 的填
  10. android Frame动画基础