在android中提供了一些简单的方法为上下文添加Menu菜单:


有三种类型的应用菜单:

OptionMenu:选项菜单:android中最常见的菜单,通过Menu键来调用

SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框,子菜单不支持嵌套,即不能包括其他子菜单

ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单


!!!注意一下:!!!

子菜单项,上下文菜单项,扩展菜单项均无法显示图标

ps:扩展菜单:选项菜单最多只能显示6个菜单项,当多于6个的时候,第六个会变成一个子菜单,用于显示装不下的部分



一.OptionMenu:选项菜单:


(一)实现流程:

1.重写onCreateOptionMenu()方法,在这里实现菜单项的内容

2.重写onOptionItemSelected()方法,这里是菜单项被单击后的回调方法,即判断点击的是哪个菜单项的触发事件


(二)代码实例:


①最普通的创建方式,在java中直接添加Title,完成对菜单项的添加

程序代码:


[java]   view plain copy print ?
  1. "font-family:Comic Sans MS;">public class MainActivity extends Activity {  
  2.   
  3.     //1.定义不同颜色的菜单项的标识:  
  4.     final private int RED = 110;  
  5.     final private int GREEN = 111;  
  6.     final private int BLUE = 112;  
  7.     final private int YELLOW = 113;  
  8.     final private int ORANGE = 114;  
  9.     //获取布局中的TextView  
  10.     private TextView text;  
  11.       
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.           
  17.         text = (TextView) findViewById(R.id.textchange);  
  18.     }  
  19.   
  20.     @Override  
  21.     //2.这里的是创建选项菜单的方法  
  22.     public boolean onCreateOptionsMenu(Menu menu) {  
  23.         // 当我们点击Menu键时,就会触发该方法  
  24.         super.onCreateOptionsMenu(menu);  
  25.         //添加菜单项:  
  26.         //参数依次为:指定菜单项的组号,ID,排序号,标题  
  27.         //排序号:按添加顺序排序的话就都填0  
  28.         menu.add(1,RED,4,"红色");  
  29.         menu.add(1,GREEN,2,"绿色");  
  30.         menu.add(1,BLUE,3,"蓝色");  
  31.         menu.add(1,YELLOW,1,"黄色");  
  32.         return true;  
  33.     }  
  34.   
  35.     //3.这里是选项菜单被点击后的回调方法,即点击菜单后触发该方法  
  36.     @Override  
  37.     public boolean onOptionsItemSelected(MenuItem item) {  
  38.         switch (item.getItemId()) {  
  39.         case RED:  
  40.             text.setTextColor(Color.RED);  
  41.             break;  
  42.         case GREEN:  
  43.             text.setTextColor(Color.GREEN);  
  44.             break;  
  45.         case BLUE:  
  46.             text.setTextColor(Color.BLUE);  
  47.             break;  
  48.         case YELLOW:  
  49.             text.setTextColor(Color.YELLOW);  
  50.             break;  
  51.         }  
  52.         return true;  
  53.     }  
  54. }  

运行截图:

点击Menu键后:

点击绿色后:





②建立菜单资源文件,并解析到menu中

首先定义一个菜单的资源文件:在res/xml目录直接新建:选择menu的类型的xml,建立menus的菜单资源文件:

menus.xml:

[html]   view plain copy print ?
  1. <span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:id="@+id/item1" android:title="@string/addper"/>  
  4.     <item android:id="@+id/item2" android:title="@string/deleteper"/>  
  5.     <item android:id="@+id/item3" android:title="@string/addgroup"/>  
  6.     <item android:id="@+id/item4" android:title="@string/deletegroup"/>  
  7.     <group android:id="@+id/setting">  
  8.         <item android:id="@+id/back" android:title="@string/setimg" android:enabled="false">item>  
  9.         <item android:id="@+id/sound" android:title="@string/setsound" android:visible="false">item>  
  10.     group>  
  11. menu>span>  

代码解释:

enabled:设置菜单项是否可用

visible:设置菜单项是否可见

group标记:将定义的菜单包装成一个菜单组

title:标题都调用string来存放字符串,这个随你



接着就是在java文件中对该菜单资源文件的加载了

这里要用到一个菜单的动态加载类:MenuInflator inflator = new MenuInflator (this);

接着调用inflate()方法解析菜单文件

代码:


[java]   view plain copy print ?
  1. "font-family:Comic Sans MS;">public boolean onCreateOptionsMenu(Menu menu) {  
  2.         MenuInflater inflator = new MenuInflater(getApplicationContext());  
  3.         inflator.inflate(R.menu.menus, menu);  
  4.         return super.onCreateOptionsMenu(menu);  
  5.     }  
  6.   
  7.   
  8.     @Override  
  9.     public boolean onOptionsItemSelected(MenuItem item) {  
  10.         Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();  
  11.         return super.onOptionsItemSelected(item);  
  12.     }  

运行截图:



代码解释:

这里的话因为我们设置了第五个菜单项不可以用,所以变灰了,还有第六个菜单项不见了,也是因为我们在菜单资源文件中设置了

菜单不可见

          

①②源码下载:

http://pan.baidu.com/s/1gSf5s


③点击某个菜单项时直接启动其他的Activity

直接调用MenuItem的setIntent(Intent)方法即可启动对应的activity

这里过于简单就略过了



二.ContextMenu上下文菜单

实现步骤:

1.重写onCreateContextMenu()方法

2.为view组件注册上下文菜单,使用registerForContextMenu()方法,参数是视图组件

3.重写onContextItemSelected()方法为菜单项指定事件监听器



ps:虽然android提供了两种创建菜单的方法:java代码中创建或者xml资源文件中定义

一般使用后者来定义菜单,这样可以减少java代码的臃肿,而且不用此次都用代码分配id,只需要修改xml文件即可修改菜单内容,而不必修改java代码的内容,

这样为程序提供了更好的解耦(代码分离)


所以以下定义菜单我们都使用xml资源文件进行定义


ContextMenu实例:

先建立一个菜单资源文件:

checkableBehavior:参数有三个:single设置为单选,all为多选,none为普通选项

[html]   view plain copy print ?
  1. <span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.      
  4.    <group android:checkableBehavior="single">  
  5.        <item android:id="@+id/blue" android:title="@string/bluetitle"/>  
  6.        <item android:id="@+id/green" android:title="@string/greentitle"/>  
  7.        <item android:id="@+id/red" android:title="@string/redtitle"/>  
  8.    group>  
  9. menu>span>  

接着再java文件中,为textview注册一个上下文菜单

重写onCreateContextMenu()方法,新建一个MenuInflater对象,调用inflate装填菜单资源文件

重写onContextItemSelected方法,这个是点击菜单项时触发

MainActivity.java

[java]   view plain copy print ?
  1. "font-family:Comic Sans MS;">public class MainActivity extends Activity {  
  2.   
  3.     private TextView text;  
  4.       
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.           
  10.         text = (TextView) findViewById(R.id.text);  
  11.         //为textView注册一个上下文菜单  
  12.         registerForContextMenu(text);  
  13.     }  
  14.       
  15.     @Override  
  16.     //重写上下文菜单的创建方法  
  17.     public void onCreateContextMenu(ContextMenu menu, View v,  
  18.             ContextMenuInfo menuInfo) {  
  19.         MenuInflater inflator = new MenuInflater(this);  
  20.         inflator.inflate(R.menu.menus, menu);  
  21.         super.onCreateContextMenu(menu, v, menuInfo);  
  22.     }  
  23.       
  24.     //上下文菜单被点击是触发该方法  
  25.     @Override  
  26.     public boolean onContextItemSelected(MenuItem item) {  
  27.         switch (item.getItemId()) {  
  28.         case R.id.blue:  
  29.             text.setTextColor(Color.BLUE);  
  30.             break;  
  31.         case R.id.green:  
  32.             text.setTextColor(Color.GREEN);  
  33.             break;  
  34.         case R.id.red:  
  35.             text.setTextColor(Color.RED);  
  36.             break;  
  37.         }  
  38.         return true;  
  39.     }  
  40. }  
  41.   

运行截图



代码解释:

代码中的注释很详细,这里就略过了



三.SubMenu子菜单

在xml中只需要在中嵌套

即可


实例:

menus.xml

[html]   view plain copy print ?
  1. <span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.    <item android:id="@+id/submenu" android:title="多选按钮演示">  
  4.       <menu>  
  5.           <group android:checkableBehavior = "all">  
  6.               <item android:id="@+id/one" android:title = "子菜单一"/>  
  7.               <item android:id="@+id/two" android:title = "子菜单二"/>  
  8.               <item android:id="@+id/three" android:title = "子菜单三"/>  
  9.           group>  
  10.       menu>  
  11.     item>  
  12. menu>span>  

MainActivity.java
[java]   view plain copy print ?
  1. "font-family:Comic Sans MS;">   //重写上下文菜单的创建方法  
  2.     public void onCreateContextMenu(ContextMenu menu, View v,  
  3.             ContextMenuInfo menuInfo) {  
  4.         MenuInflater inflator = new MenuInflater(this);  
  5.         inflator.inflate(R.menu.menus, menu);  
  6.         super.onCreateContextMenu(menu, v, menuInfo);  
  7.     }  
  8.       
  9.     //上下文菜单被点击是触发该方法  
  10.     @Override  
  11.     public boolean onContextItemSelected(MenuItem item) {  
  12.         item.setChecked(true);  
  13.         switch (item.getItemId()) {  
  14.         case R.id.one:  
  15.             item.setCheckable(true);  
  16.             break;  
  17.         case R.id.two:  
  18.             item.setCheckable(true);  
  19.             break;  
  20.         case R.id.three:  
  21.             item.setCheckable(true);  
  22.             break;  
  23.         }  
  24.         return true;  
  25.     }  

运行截图:

点击后:


代码解释:

这个代码和上面上下文的菜单没什么不同,只是修改了一下menus文件的内容,使用了子菜单

如果想在Java代码中设置上下文代码只需要:addSubMenu()

 SubMenu file = menu.addSubMenu("文件");类似于这样,file还要add添加菜单项哦!




更多相关文章

  1. Android之Activity生命周期的浅析(二)
  2. android Service服务
  3. Android(安卓)动态壁纸 Livepaper
  4. Android(安卓)四大组件 —— 广播(广播机制解析)
  5. android 四大组件之Service两种调用方式使用详解
  6. Android(安卓)View的onClick事件监听
  7. Android创建桌面快捷方式两种方法
  8. Android世界第一个activity启动过程
  9. 实现Android的不同精度的定位(基于网络和GPS)[转]

随机推荐

  1. Android(安卓)SDK 2.3与Eclipse最新版开
  2. Android(安卓)apk获取系统权限
  3. Android之NDK开发
  4. Android启动过程深入解析
  5. Android高手进阶教程(七)之----Android(
  6. 基于Win10、Cordova9.0.0的Android开发环
  7. android 屏幕适配
  8. Android布局背景颜色设置
  9. Android基本界面元素的使用与讲解
  10. android控件布局