我们知道,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);
	}

说明:



  1. 该方法有四种重载形式,这里只讲这里用到的一种,add(int groupId,int itemId,int order,CharSequence title);
  • groupId:分组ID,这个是用于选项按钮菜单,跟单选框的分组概念类似.
  • itemId:当前添加菜单项的ID,用这个ID来对应某一个菜单项;
  • order:显示顺序的ID,用来选择在菜单中出现的顺序.
  • title:菜单项标题的字符串,这里有一种重载是int titleRes,可以从XML中获取字符串资源;
  1. add方法返回menuItem,可以继续在后面添加关联菜单的图像,例如add(1,1,1,“菜单项1”).addIcon(R.drawable.ic_media_paly);
  2. 选项菜单最多显示6个,不足6个,根据实际情况来显示排列状态,超过6个,在第6个会显示更多,点击更多,会列出其他的菜单项,只不过这时候样子类似子菜单;
  3. 该方法返回值,我们可以直接设置为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);
	}



说明:


  1. add方法与创建选项菜单一致;
  2. 设置选项为复选框类型,需要设置setCheckable为true,但是设置为选项框的时候,不需要设置setCheckable,而是要将groupId相同的一组绑定到一起,就是设置setGroupCheckable,该方法第1个为组,第2个必须为true,如果第3个设置true,则表示在一个组的子菜单项会被设置为单选框,如果为false,则会被设置为复选框。
  3. 上下文菜单与其他不同的是必须要注册到指定的VIEW上显示,注册需要使用Activity的registerForContextMenu方法,例如:registerForContextMenu(button);
  4. 当一个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种方法:


  1. 单击任何类型的菜单项(选项菜单,选项菜单子菜单,上下文菜单,上下文菜单子菜单),都会调用onMenuItemSelected方法。
  2. 单击选项菜单,或者单击选项菜单的子菜单,会调用onOptionsItemSelected方法.
  3. 单击上下文菜单,或者单击上下文菜单的子菜单,会调用onContextItemSelected方法.
  4. 如果想独立响应事件的代码,可以自己写监听事件实现onMenuItemClickListener接口的类,在onMenuItemClick中处理;



注意:


这四个处理事件都会返回一个boolean的值,一般情况下,都可以返回为true。但是,如果设置了onMenuItemClickListener,


在onMenuItemClick方法中返回了true,那么其他3种都无效了。如果在在onMenuItemClick方法中返回了false,那么系统就会调用


onMenuItemSelected方法,并且会根据菜单的类型来决定调用onOptionsItemSelected还是onContextItemSelected方法。如果在


onMenuItemSelected方法种未调用super.onMenuItemSelected,那么系统就不会调用其他两个方法。