概念

  在Android的应用程序中,菜单可分为两种:一种是选项菜单(Option Menu),另一种是上下文菜单(Context Menu)。选项菜单是指,当用户按下菜单键后出现的菜单;上下文菜单是当用户在某个View对象上长按时出现的菜单,类似于Windows平台下的鼠标右键。

Android系统中,每个Activity有且仅有一个Option Menu对象;而Context Menu是针对View的,一个View有且仅有一个Context Menu对象。

(1)选项菜单 特点:

  • 每个菜单可以拥有一个图标和一个快捷键(适用于常用的全键盘设备)
  • 菜单的显示区域是固定大小的,成为菜单框,而且里面最多只能显示6个菜单项,如果有更多的显示菜单项,则会出现一个“更多”的图标,单击后,在“更多”菜单项中,不能出现图标。

菜单项属性

名称 描述   
groupId 群组号,指定该菜单所属的群组,便于同时对多个菜单项进行操作
itemId 单个菜单项的号,可以针对单独的菜单项操作
order 指定该菜单在菜单框中出现的次序
title 该菜单项的标题

(2)上下文菜单 特点:

  • Context Menu没有图标和快捷键
  • 一个Context Menu中的菜单项数目基本不受限制
  • Context Menu中的菜单项可以使用复选框或者单选框

Activity中的每个VIew都可以指定不同的上下文菜单,但实际开发中,上下文菜单多用于列表类,比如联系人列表、短信列表等,由于列表类视图中所有的列表项都在一个ListView里面,所以单击里面的每一个列表项,弹出的上下文菜单都是一样的。

创建Option Menu

Option Menu 内部调用的流程

注意:当Activity启动的时候,系统会调用onCreateOptionMenu方法,仅且调用一次,主要完成菜单的初始化工作,可以在此处给选项菜单中添加新的菜单项,在随后的Activity活动中,不会再调用此方法。

用户每次按下菜单键,系统会调用onPrepareOptionsMenu方法,可以在该方法里面添加一些动态改变菜单内容的代码,比如可以根据当前的需求,隐藏一些不需要的菜单项,或者再添加一些菜单项。onPrepareOptionsMenu的默认操作就是弹出已有的选项菜单。

用户选择某个菜单项时,系统会调用onOptionsItemSelected方法,可以重写该方法来实现具体的应用需求。

用户取消菜单或者执行完onOptionsItemSelected方法后,系统都会调用onOptionsMenuClosed方法,该方法默认操作是隐藏菜单框,一般不重写。

实例代码:特别注意返回值的意义

 1     @Override 2     public boolean onCreateOptionsMenu(Menu menu) { 3         //MenuItem menu.add(int groupId,int itemId,int order,CharSequence title); 4         menu.add(0,1,Menu.NONE,"Setting"); 5         menu.add(0,2,Menu.NONE,"Exit"); 6         return true; 7         //返回值一般为true,意味着系统可以继续处理剩下的逻辑,比如将菜单框显示在用户界面上 8         //如果返回为false,那么系统将不再做任何的处理 9     }10     @Override11     public boolean onOptionsItemSelected(MenuItem item) {12         // TODO Auto-generated method stub13         int id = item.getItemId();14         switch(id){15         case 1://设置16             Toast.makeText(this, "Setting", Toast.LENGTH_SHORT).show();17             break;18         case 2://退出19             Toast.makeText(this, "Exit", Toast.LENGTH_SHORT).show();20             break;21             default:;22         }23         return false;24         //返回值为false代表继续执行系统内部的默认处理,比如选择菜单后,菜单框一般会隐藏25         //返回值为true,代表中止继续执行,菜单框不会隐藏26         //return super.onOptionsItemSelected(item);27     }

创建 Context Menu

Activity启动时,系统并没有创建上下文菜单的函数调用,而是程序猿更加需要,在onCreate方法里面注册需要上下文菜单的视图。注册的方法调用registerForContextMenu(View),传入的参数是需要上下文菜单的视图对象。

Context Menu 启动流程

ContextMenu的生命周期仅在onCreateContextMenuonContextMenuClosed之间,更新ContextMenu里面的菜单项只能在onCreateContextMenu里面进行;OptionMenuActivity启动后的整个生命周期都有效,可以通过OptionMenu的引用去随时更新OptionMenu的菜单项。

样例代码:

 1     @Override 2     public boolean onContextItemSelected(MenuItem item) { 3         //一个Activity中,所有的Context Menu调用同一个onContextItemSelected方法 4         int itemid = item.getItemId(); 5         if(item.getGroupId() == 2){ 6             TextView tv = (TextView)findViewById(R.id.state); 7             switch(itemid){ 8             case 21: 9                 tv.setText("Hidden");10                 mIsGroupVisible = false;11                 Toast.makeText(this, "Hidden item GroupId equal to 1", Toast.LENGTH_SHORT).show();12                 flush(mChecked);13                 mChecked[0]=true;14                 break;15             case 22:16                 tv.setText("Display");17                 mIsGroupVisible = true;18                 Toast.makeText(this, "Display item GroupId equal to 1", Toast.LENGTH_SHORT).show();19                 flush(mChecked);20                 mChecked[1]=true;21                 break;            22                 default:;23             }24         }else{25             TextView tv = (TextView)findViewById(R.id.result);26             String title = item.getTitle().toString();27             tv.setText("Choose id:"+itemid+" ,title:"+title);28         }29         30         return super.onContextItemSelected(item);31     }32     private void flush(boolean[] mChecked2) {33         // TODO Auto-generated method stub34         mChecked2[0]= false;35         mChecked2[1]= false;36     }37     private boolean mIsGroupVisible = false;38     private boolean mChecked[]={true,false,false};39     40     @Override41     public void onCreateContextMenu(ContextMenu menu, View v,42             ContextMenuInfo menuInfo) {43         44         Resources res = getResources();45         Drawable icon = res.getDrawable(R.drawable.ic_launcher);46         switch(v.getId()){47         //Android 并没有为每一个View提供单独的onCreateContextMenu方法48         //so,要根View的id值来区分49         case R.id.background:50             if(menu.hasVisibleItems())return;51             menu.add(0,1,Menu.NONE,"金").setIcon(icon);//Context Menu 不能显示图标52             menu.add(1,2,Menu.NONE,"甲");53             menu.add(0,3,Menu.NONE,"木");54             menu.add(1,4,Menu.NONE,"乙");55             menu.add(0,5,Menu.NONE,"水");56             menu.add(1,6,Menu.NONE,"丙");57             menu.add(0,7,Menu.NONE,"火");58             menu.add(1,8,Menu.NONE,"丁").setIcon(icon);59             menu.add(0,9,Menu.NONE,"土");60             menu.setGroupVisible(1, mIsGroupVisible);61             break;62         case R.id.state:63             //设置单选或复选菜单 Option Menu和Context Menu都可用,常用于Context Menu64             //单选菜单,在菜单群组中各菜单项互斥65             //调用setGroupCheckable方法 void setGroupCheckable(int groupId,boolean checkable, boolean exclusive);66             //groupId指定设置的群组67             //checkable指定群组是否可选,true可选68             //exclusive 指定该项是否为互斥,true单选,false多选69             menu.add(2,21,Menu.NONE,"Hidden_Group1").setChecked(mChecked[0]);70             menu.add(2,22,Menu.NONE,"Display_Group1").setChecked(mChecked[1]);71             menu.setGroupCheckable(2, true, true);72             73             break;74             default:;75         }76         super.onCreateContextMenu(menu, v, menuInfo);77     }

子菜单、单选与复选菜单 参考上例代码。

在XML文件中描述菜单

XML语法中,有3个元素用来描述菜单,分别是<menu><item><group>

更多相关文章

  1. Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的
  2. 获取Android崩溃crash信息并写入日志
  3. Android(安卓)开发规范总结
  4. Android(安卓)NDK开发之旅(1): Eclipse中NDK环境搭建与JNI开发流
  5. Android基础入门教程——7.1.3 Android(安卓)HTTP请求方式-HttpU
  6. Android(安卓)Service学习之本地服务
  7. 给 Android(安卓)开发者的 Flutter 指南(上)
  8. Android(安卓)CheckBox
  9. android 菜单导航 (Fragment + RadioGroup)

随机推荐

  1. Android 照相机的实例应用
  2. Android中模拟器如何访问本地mysql数据库
  3. Enable Geolocation in a WebView (Andro
  4. Android 强制横屏或竖屏设置
  5. Warning: License for package Android S
  6. mmsplayer for ios 版本已经完成。支持ip
  7. Android(安卓)8.0 的开机广播 和 IntentS
  8. Android WebView ScrollBar设置
  9. android LayoutInflater三种获取方式
  10. android 创建快捷方式 删除快捷方式 不重