首页 > 代码库 > Android 菜单简析01(OptionsMenu)

Android 菜单简析01(OptionsMenu)

Android 的菜单机制,在 Android 3.0 之前和之后有很大的去别,Android 3.0 推出 ActionBar ,导航的 UI 交互有很大的变化,但菜单的逻辑和接口还是一样的。这里主要介绍下 Android 菜单创建、使用,后面介绍 ActionBar,SherlockActionBar 与 菜单的结合使用,自定义菜单的创建。

Android 菜单主要有4种:

OptionMenu

ContextMenu

PopMenu

SubMenu

下面先介绍下 OptionMenu ,分别使用 xml 文件和 JAVA 代码创建 菜单。

1.OptionMenu

选项菜单,点击 Menu 键时弹出,选中菜单项或者点击其他区域,菜单消失。

optionMenu 的相关方法的实现在 Activity 中 ,相关的方法有:


@Override
public boolean onCreateOptionsMenu(Menu menu) {

    Log.d(tag, "onCreateOptionsMenu");
    return super.onCreateOptionsMenu(menu);

}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    Log.d(tag, "onPrepareOptionsMenu");

    return super.onPrepareOptionsMenu(menu);
}

@Override
public void onOptionsMenuClosed(Menu menu) {

    System.out.println("onOptionsMenuClosed");
    Log.d(tag, "onOptionsMenuClosed");

    super.onOptionsMenuClosed(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.action_save:
        Log.d(tag, "action_save");
        break;

    case R.id.action_settings:
        Log.d(tag, "action_settings");
        break;
    case R.id.action_delete:
        Log.d(tag, "action_delete");
        break;
    case R.id.action_edit:
        Log.d(tag, "action_edit");
        break;

    }

    return super.onOptionsItemSelected(item);
}

onCreateOptionMenu ,在 Activity 生命周期内 只执行一次,onPrepareOptionMenu每次打开菜单都会执行,菜单消失的时候执行onOptionsMenuClosed方法,菜单被选中时执行 onOptionsItemSelected 。

下面看下在 Android 2.3 系统上用 XML 创建的 OptionMenu ,具体效果图如下。




第一张:4个菜单选项,没有图标

第二张:8个菜单项,有图标

第三张:点击更多,没有图标

同样的代码,如果 不兼容(最低版本>11) Android 3.0 之前的版本,在 Android4.4 上是什么效果呢 ?








第一张:4个菜单选项,没有图标 ,只显示出两个,多了一个更多的标识

第二张:点击更多菜单项

第三张:8个菜单项,有图标,但是显示出的菜单没有文字,更多中菜单项只有文字

第四张:点击更多,没有图标

下面看下具体的代码

1. 编写 menu.xml



<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/action_share"
    android:orderInCategory="0"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_share"
    android:title="share"/>
<item
    android:id="@+id/action_save"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_save"
    android:title="save"/>
<item
    android:id="@+id/action_search"
    android:orderInCategory="2"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_search"
    android:title="search"/>
<item
    android:id="@+id/action_delete"
    android:orderInCategory="4"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_delete"

    android:title="delectAction"/>

 <item
    android:id="@+id/action_edit"
    android:orderInCategory="5"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_edit"
    android:title="edit"/>

   <item
    android:id="@+id/action_help"
    android:orderInCategory="6"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_help"
    android:title="help"/>

      <item
    android:id="@+id/action_compass"
    android:orderInCategory="6"
    android:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_compass"
    android:title="compass"/>

    </menu>

android:orderInCategory 菜单项在 菜单中的位置


2. 在 Activity 中添加 菜单



@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    Log.d(tag, "onCreateOptionsMenu");
    inflater.inflate(R.menu.main_icon, menu);
    return super.onCreateOptionsMenu(menu);

}

3. 菜单事件的响应


    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.action_save:
        Log.d(tag, "action_save");
        break;

    case R.id.action_settings:
        Log.d(tag, "action_settings");
        break;
    case R.id.action_delete:
        Log.d(tag, "action_delete");
        break;
    case R.id.action_edit:
        Log.d(tag, "action_edit");
        break;

    case R.id.action_search:
        Log.d(tag, "action_search");
        break;

    }

    return super.onOptionsItemSelected(item);
}

这样,就完成了菜单的创建、使用、响应。

Android 官方推荐使用 XML 创建菜单,同时也可以在 JAVA 代码中创建 菜单。实现过程如下

a. 直接在 onCreateOptionsMenu() 方法中添加菜单项


  @Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    //menu.add(int groupid,int itemid,int orderid,String title)方法参数
    //add 方法返回一个 MenuItem 对象,可以添加图标,调用 setIcon() 方法
    Log.d(tag, "onCreateOptionsMenu");
    menu.add(0, Menu.FIRST+1, Menu.FIRST+1, menusStrings[0]).setIcon(android.R.drawable.ic_menu_add);
    menu.add(0, Menu.FIRST+2, Menu.FIRST+2, menusStrings[1]).setIcon(android.R.drawable.ic_menu_agenda);
    menu.add(0, Menu.FIRST+3, Menu.FIRST+3, menusStrings[2]).setIcon(android.R.drawable.ic_menu_call);
    menu.add(0, Menu.FIRST+4, Menu.FIRST+4, menusStrings[3]).setIcon(android.R.drawable.ic_menu_close_clear_cancel);
    menu.add(0, Menu.FIRST+5, Menu.FIRST+5, menusStrings[4]).setIcon(android.R.drawable.ic_menu_crop);
    menu.add(0, Menu.FIRST+6, Menu.FIRST+6, menusStrings[5]).setIcon(android.R.drawable.ic_menu_upload);
    inflater.inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);

}

b. 响应菜单选中事件

响应选中事件方式和上面一样,就不再贴出代码了~。


关于 OptionsMenu的 介绍就这些啦,大家有问题在评论交流啊 


下一篇给大家介绍 ContexMenu 的使用


参考资料:

官方手册

eoe menu wiki

参考博文 menu 介绍

参考博文 menu 介绍






Android 菜单简析01(OptionsMenu)