在android中提供了一些简单的方法为上下文添加Menu菜单:
有三种类型的应用菜单:
OptionMenu:选项菜单:android中最常见的菜单,通过Menu键来调用
SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框,子菜单不支持嵌套,即不能包括其他子菜单
ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单
!!!注意一下:!!!
子菜单项,上下文菜单项,扩展菜单项均无法显示图标
ps:扩展菜单:选项菜单最多只能显示6个菜单项,当多于6个的时候,第六个会变成一个子菜单,用于显示装不下的部分
(一)实现流程:
1.重写onCreateOptionMenu()方法,在这里实现菜单项的内容
2.重写onOptionItemSelected()方法,这里是菜单项被单击后的回调方法,即判断点击的是哪个菜单项的触发事件
(二)代码实例:
①最普通的创建方式,在java中直接添加Title,完成对菜单项的添加
程序代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| 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/menu目录直接新建:选择menu的类型的xml,建立menus的菜单资源文件:
menus.xml:
1 2 3 4 5 6 7 8 9 10 11
| <?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>
|
代码解释:
enabled:设置菜单项是否可用
visible:设置菜单项是否可见
group标记:将定义的菜单包装成一个菜单组
title:标题都调用string来存放字符串,这个随你
接着就是在java文件中对该菜单资源文件的加载了
这里要用到一个菜单的动态加载类:MenuInflator inflator = new MenuInflator (this);
接着调用inflate()方法解析菜单文件
代码:
1 2 3 4 5 6 7 8 9 10 11 12
| 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
这里过于简单就略过了
实现步骤:
1.重写onCreateContextMenu()方法
2.为view组件注册上下文菜单,使用registerForContextMenu()方法,参数是视图组件
3.重写onContextItemSelected()方法为菜单项指定事件监听器
ps:虽然android提供了两种创建菜单的方法:java代码中创建或者xml资源文件中定义
一般使用后者来定义菜单,这样可以减少java代码的臃肿,而且不用此次都用代码分配id,只需要修改xml文件即可修改菜单内容,而不必修改java代码的内容,
这样为程序提供了更好的解耦(代码分离)
所以以下定义菜单我们都使用xml资源文件进行定义
ContextMenu实例:
先建立一个菜单资源文件:
checkableBehavior:参数有三个:single设置为单选,all为多选,none为普通选项
1 2 3 4 5 6 7 8 9
| <?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>
|
接着再java文件中,为textview注册一个上下文菜单
重写onCreateContextMenu()方法,新建一个MenuInflater对象,调用inflate装填菜单资源文件
重写onContextItemSelected方法,这个是点击菜单项时触发
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| 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; } }
|
运行截图(长按TextView)
代码解释:
代码中的注释很详细,这里就略过了
在xml中只需要在<Item>
中嵌套<menu>
即可
实例:
menus.xml
1 2 3 4 5 6 7 8 9 10 11 12
| <?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>
|
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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添加菜单项哦!