在android中提供了一些简单的方法为上下文添加Menu菜单:
有三种类型的应用菜单:
OptionMenu:选项菜单:android中最常见的菜单,通过Menu键来调用
SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框,子菜单不支持嵌套,即不能包括其他子菜单
ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单
!!!注意一下:!!!
子菜单项,上下文菜单项,扩展菜单项均无法显示图标
ps:扩展菜单:选项菜单最多只能显示6个菜单项,当多于6个的时候,第六个会变成一个子菜单,用于显示装不下的部分
一.OptionMenu:选项菜单:
(一)实现流程:
1.重写onCreateOptionMenu()方法,在这里实现菜单项的内容
2.重写onOptionItemSelected()方法,这里是菜单项被单击后的回调方法,即判断点击的是哪个菜单项的触发事件
(二)代码实例:
①最普通的创建方式,在java中直接添加Title,完成对菜单项的添加
程序代码:
[java]
view plain copy print ?
- "font-family:Comic Sans MS;">public class MainActivity extends Activity {
-
-
- final private int RED = 110;
- final private int GREEN = 111;
- final private int BLUE = 112;
- final private int YELLOW = 113;
- final private int ORANGE = 114;
-
- private TextView text;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- text = (TextView) findViewById(R.id.textchange);
- }
-
- @Override
-
- public boolean onCreateOptionsMenu(Menu menu) {
-
- super.onCreateOptionsMenu(menu);
-
-
-
- menu.add(1,RED,4,"红色");
- menu.add(1,GREEN,2,"绿色");
- menu.add(1,BLUE,3,"蓝色");
- menu.add(1,YELLOW,1,"黄色");
- return true;
- }
-
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case RED:
- text.setTextColor(Color.RED);
- break;
- case GREEN:
- text.setTextColor(Color.GREEN);
- break;
- case BLUE:
- text.setTextColor(Color.BLUE);
- break;
- case YELLOW:
- text.setTextColor(Color.YELLOW);
- break;
- }
- return true;
- }
- }
运行截图:
点击Menu键后:
点击绿色后:
②建立菜单资源文件,并解析到menu中
首先定义一个菜单的资源文件:在res/xml目录直接新建:选择menu的类型的xml,建立menus的菜单资源文件:
menus.xml:
[html]
view plain copy print ?
- <span style="font-family:Comic Sans MS;">xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:id="@+id/item1" android:title="@string/addper"/>
- <item android:id="@+id/item2" android:title="@string/deleteper"/>
- <item android:id="@+id/item3" android:title="@string/addgroup"/>
- <item android:id="@+id/item4" android:title="@string/deletegroup"/>
- <group android:id="@+id/setting">
- <item android:id="@+id/back" android:title="@string/setimg" android:enabled="false">item>
- <item android:id="@+id/sound" android:title="@string/setsound" android:visible="false">item>
- group>
- menu>span>
代码解释:
enabled:设置菜单项是否可用
visible:设置菜单项是否可见
group标记:将定义的菜单包装成一个菜单组
title:标题都调用string来存放字符串,这个随你
接着就是在java文件中对该菜单资源文件的加载了
这里要用到一个菜单的动态加载类:MenuInflator inflator = new MenuInflator (this);
接着调用inflate()方法解析菜单文件
代码:
[java]
view plain copy print ?
- "font-family:Comic Sans MS;">public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflator = new MenuInflater(getApplicationContext());
- inflator.inflate(R.menu.menus, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
- return super.onOptionsItemSelected(item);
- }
运行截图:
代码解释:
这里的话因为我们设置了第五个菜单项不可以用,所以变灰了,还有第六个菜单项不见了,也是因为我们在菜单资源文件中设置了
菜单不可见
①②源码下载:
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 ?
- <span style="font-family:Comic Sans MS;">xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
-
- <group android:checkableBehavior="single">
- <item android:id="@+id/blue" android:title="@string/bluetitle"/>
- <item android:id="@+id/green" android:title="@string/greentitle"/>
- <item android:id="@+id/red" android:title="@string/redtitle"/>
- group>
- menu>span>
接着再java文件中,为textview注册一个上下文菜单
重写onCreateContextMenu()方法,新建一个MenuInflater对象,调用inflate装填菜单资源文件
重写onContextItemSelected方法,这个是点击菜单项时触发
MainActivity.java
[java]
view plain copy print ?
- "font-family:Comic Sans MS;">public class MainActivity extends Activity {
-
- private TextView text;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- text = (TextView) findViewById(R.id.text);
-
- registerForContextMenu(text);
- }
-
- @Override
-
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- MenuInflater inflator = new MenuInflater(this);
- inflator.inflate(R.menu.menus, menu);
- super.onCreateContextMenu(menu, v, menuInfo);
- }
-
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.blue:
- text.setTextColor(Color.BLUE);
- break;
- case R.id.green:
- text.setTextColor(Color.GREEN);
- break;
- case R.id.red:
- text.setTextColor(Color.RED);
- break;
- }
- return true;
- }
- }
-
运行截图
代码解释:
代码中的注释很详细,这里就略过了
三.SubMenu子菜单
在xml中只需要在- 中嵌套
实例:
menus.xml
[html]
view plain copy print ?
- <span style="font-family:Comic Sans MS;">xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/submenu" android:title="多选按钮演示">
- <menu>
- <group android:checkableBehavior = "all">
- <item android:id="@+id/one" android:title = "子菜单一"/>
- <item android:id="@+id/two" android:title = "子菜单二"/>
- <item android:id="@+id/three" android:title = "子菜单三"/>
- group>
- menu>
- item>
- menu>span>
MainActivity.java
[java]
view plain copy print ?
- "font-family:Comic Sans MS;">
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- MenuInflater inflator = new MenuInflater(this);
- inflator.inflate(R.menu.menus, menu);
- super.onCreateContextMenu(menu, v, menuInfo);
- }
-
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- item.setChecked(true);
- switch (item.getItemId()) {
- case R.id.one:
- item.setCheckable(true);
- break;
- case R.id.two:
- item.setCheckable(true);
- break;
- case R.id.three:
- item.setCheckable(true);
- break;
- }
- return true;
- }
运行截图:
点击后:
代码解释:
这个代码和上面上下文的菜单没什么不同,只是修改了一下menus文件的内容,使用了子菜单
如果想在Java代码中设置上下文代码只需要:addSubMenu()
SubMenu file = menu.addSubMenu("文件");类似于这样,file还要add添加菜单项哦!