Android 菜单总结

我们知道,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中获取字符串资源;
  2. add方法返回menuItem,可以继续在后面添加关联菜单的图像,例如add(1,1,1,“菜单项1”).addIcon(R.drawable.ic_media_paly);
  3. 选项菜单最多显示6个,不足6个,根据实际情况来显示排列状态,超过6个,在第6个会显示更多,点击更多,会列出其他的菜单项,只不过这时候样子类似子菜单;
  4. 该方法返回值,我们可以直接设置为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,那么系统就不会调用其他两个方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值