Android 中选项菜单(Option menu)的用法

Posted 路宇_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 中选项菜单(Option menu)的用法相关的知识,希望对你有一定的参考价值。

先看下效果:
在这里插入图片描述
菜单在程序中使用颇为广泛,几乎所有的桌面应用都含有菜单。android的菜单分为三种类型

option menu:选项菜单
context menu: 上下文菜单
popup menu:弹出菜单

本文讲解的是选项菜单。
1.首先在res目录下,创建menu文件夹,之后在menu文件中,创建item_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/item_home"
        android:title="首页"
        android:icon="@drawable/ic_about"
        app:showAsAction="never"
        android:orderInCategory="1"
        >
    </item>
    <item
        android:id="@+id/item_quit"
        android:title="退出"
        android:icon="@drawable/ic_quit"
        app:showAsAction="never"
        android:orderInCategory="2"
        >
    </item>
</menu>

2.之后在创建的Activity中重写onCreateOptionsMenu() -->构建菜单页面的布局,和onOptionsItemSelected()–>点击菜单的回调事件

	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //从item_menu.xml中构建菜单页面布局
        getMenuInflater().inflate(R.menu.item_menu,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int v = item.getItemId();
        if (v==R.id.item_home){
            Toast.makeText(this, "点击了首页", Toast.LENGTH_SHORT).show();
            return true;
        }else if (v==R.id.item_quit){
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

3.如果要想让菜单的图标显示,需要重写onMenuOpened()方法

 	@Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        //显示菜单项左侧的图标
        MenuUtil.setOverflowIconVisible(featureId,menu);
        return super.onMenuOpened(featureId, menu);
    }

其中MenuUtil,我抽离出写成了一个工具类,代码如下:

public class MenuUtil {

    // 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu
    // API18以下需要该函数在右上角强制显示选项菜单
    public static void forceShowOverflowMenu(Context context) {
        try {
            ViewConfiguration config = ViewConfiguration.get(context);
            Field menuKeyField = ViewConfiguration.class.
                    getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField != null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 显示OverflowMenu的Icon
    public static void setOverflowIconVisible(int featureId, Menu menu) {
        // ActionBar的featureId是8,Toolbar的featureId是108
        if (featureId % 100 == Window.FEATURE_ACTION_BAR && menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    // setOptionalIconsVisible是个隐藏方法,需要通过反射机制调用
                    Method m = menu.getClass().getDeclaredMethod(
                            "setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

< item >标签常见属性:

android:id:菜单项(MenuItem)的唯一标识。
android:icon:菜单项的图标,在溢出菜单中需要显示图标以及标题,需要额外代码中配置。
android:title:菜单项的标题
android:showAsAction:指定菜单项的显示方式,多个属性值之间可以使用 | 隔开,参数值有

有效值描述
always在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。
ifRoom菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。
never菜单项永远只会出现在溢出菜单中。
withText无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。
collapseActionView此选项是在Api14引入的属性,搭配android:actionLayout或者android:actionViewClass使用,可起到折叠视图的效果

orderInCategory:组内的重要性顺序

以上便是实现选项菜单的基本步骤和用法,如有不当之处,还望各位加以指正,一起学习,共同进步!

以上是关于Android 中选项菜单(Option menu)的用法的主要内容,如果未能解决你的问题,请参考以下文章

android 怎么把menu按钮事情显示出来的菜单替换成另一个Activity

java 以编程方式从菜单中删除项目。 |||链接:https://stackoverflow.com/questions/7133141/android-changing-option-menu-i

android menu 有啥用

android 创建选项菜单没有反应。单击menu键时没出现菜单,帮忙看看吧

android中的菜单menu可以在屏幕上一直显示吗

菜单(Menu)的三中创建方式——Android开发之路2