我们知道,android菜单分为三种,分别为选项菜单(OptionMenu),上下文菜单(ContextMenu),以及子菜单(SubMenu)。其中,选项菜单跟上下文菜单中,都可以嵌套子菜单,而子菜单本身不能再嵌套子菜单,否则会抛出异常。而我们建立菜单的方式一般可以在activity中覆写父类的方法,也可以通过XML来实现菜单,网上这些例子都讲的非常清楚,这里只做记录,不具体实现如何用两种方式创建菜单。
选项菜单(OptionMenu) 创建选项菜单需要覆盖父类的onCreateOptionsMenu(Menu menu)方法,通过Menu的add方法来添加一个选项菜单。
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1,1,1,"菜单项1");
menu.add(1,2,2,"菜单项2");
menu.add(1,3,3,"菜单项3");
menu.add(1,4,4,"菜单项4");
menu.add(1,5,5,"菜单项5");
menu.add(1,6,6,"菜单项6");
return super.onCreateOptionsMenu(menu);
}
说明:
- 该方法有四种重载形式,这里只讲这里用到的一种,add(int groupId,int itemId,int order,CharSequence title);
- groupId:分组ID,这个是用于选项按钮菜单,跟单选框的分组概念类似.
- itemId:当前添加菜单项的ID,用这个ID来对应某一个菜单项;
- order:显示顺序的ID,用来选择在菜单中出现的顺序.
- title:菜单项标题的字符串,这里有一种重载是int titleRes,可以从XML中获取字符串资源;
- add方法返回menuItem,可以继续在后面添加关联菜单的图像,例如add(1,1,1,“菜单项1”).addIcon(R.drawable.ic_media_paly);
- 选项菜单最多显示6个,不足6个,根据实际情况来显示排列状态,超过6个,在第6个会显示更多,点击更多,会列出其他的菜单项,只不过这时候样子类似子菜单;
- 该方法返回值,我们可以直接设置为true,这里调用父类的方法,
当然,我们也可以用XML来创建菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/media_play"
android:icon="@android:drawable/ic_media_play"
android:title="@string/play"/>
<item
android:id="@+id/media_pause"
android:icon="@android:drawable/ic_media_pause"
android:title="@string/pause"/>
<!-- 这里嵌套是添加子菜单 -->
<item
android:id="@+id/media_file"
android:title="@string/file">
<menu>
<item
android:id="@+id/file_open"
android:title="open"/>
<item
android:id="@+id/file_save"
android:title="save"/>
<item
android:id="@+id/file_save_as"
android:title="saveas"/>
<item
android:id="@+id/file_exit"
android:title="exit"/>
</menu>
</item>
<item
android:id="@+id/edit"
android:title="Edit">
<menu>
<group>
<item
android:id="@+id/edit_copy"
android:title="Copy"
android:checkable="true"/>
<item
android:id="@+id/edit_paste"
android:title="Paste"/>
<item
android:id="@+id/edit_cut"
android:title="Cut"/>
<item
android:id="@+id/edit_delete"
android:title="Delete"/>
</group>
</menu>
</item>
</menu>
然后我们在java代码中,
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
- 上下文菜单(ContextMenu)
创建选项菜单需要覆盖父类的onCreateContextMenu(Menu menu,View view,ContextMenuInfo menuInfo)方法。
上下文菜单不能带图像,但是可以带单选按钮和复选框。
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("上下文菜单");
menu.setHeaderIcon(R.drawable.menuIcon);
menu.add(0, 1, Menu.FIRST, "菜单项1").setCheckable(true).setChecked(true);
menu.add(1,2, Menu.FIRST+1,"菜单项2");
menu.add(1,3,Menu.FIRST+2,"菜单项3").setChecked(true);
menu.setGroupCheckable(1, true, true);
}
说明:
- add方法与创建选项菜单一致;
- 设置选项为复选框类型,需要设置setCheckable为true,但是设置为选项框的时候,不需要设置setCheckable,而是要将groupId相同的一组绑定到一起,就是设置setGroupCheckable,该方法第1个为组,第2个必须为true,如果第3个设置true,则表示在一个组的子菜单项会被设置为单选框,如果为false,则会被设置为复选框。
- 上下文菜单与其他不同的是必须要注册到指定的VIEW上显示,注册需要使用Activity的registerForContextMenu方法,例如:registerForContextMenu(button);
- 当一个view关联上上下文菜单之后,长触摸该view,就会弹出上下文菜单。
- 子菜单项(SubMenu)
子菜单与上述两种菜单都可以结合使用,但是子菜单自身不能嵌套子菜单。
创建子菜单的方法如下:
onCreateOptionsMenu(Menu menu)中,或者onCreateContextMenu(Menu menu,View view,ContextMenuInfo menuInfo)中,
SubMenu subMenu = menu.addSubMenu(groupId, itemId, order, title);
subMenu.add(groupId, itemId, order, title);
该add方法与上述一样。
- 菜单点击事件
关于android菜单点击事件的处理,一共有4种方法:
- 单击任何类型的菜单项(选项菜单,选项菜单子菜单,上下文菜单,上下文菜单子菜单),都会调用onMenuItemSelected方法。
- 单击选项菜单,或者单击选项菜单的子菜单,会调用onOptionsItemSelected方法.
- 单击上下文菜单,或者单击上下文菜单的子菜单,会调用onContextItemSelected方法.
- 如果想独立响应事件的代码,可以自己写监听事件实现onMenuItemClickListener接口的类,在onMenuItemClick中处理;
注意:
这四个处理事件都会返回一个boolean的值,一般情况下,都可以返回为true。但是,如果设置了onMenuItemClickListener,
在onMenuItemClick方法中返回了true,那么其他3种都无效了。如果在在onMenuItemClick方法中返回了false,那么系统就会调用
onMenuItemSelected方法,并且会根据菜单的类型来决定调用onOptionsItemSelected还是onContextItemSelected方法。如果在
onMenuItemSelected方法种未调用super.onMenuItemSelected,那么系统就不会调用其他两个方法。