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

简介: 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:组内的重要性顺序

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


目录
相关文章
|
4天前
|
Android开发
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
13 0
|
2月前
|
Java Android开发 数据安全/隐私保护
安卓逆向 -- IDA基本用法
安卓逆向 -- IDA基本用法
41 0
|
4月前
|
Android开发
[Android]DrawerLayout滑动菜单+NavigationView
[Android]DrawerLayout滑动菜单+NavigationView
27 0
|
4月前
|
XML Java Android开发
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
67 0
|
4月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
62 0
|
8月前
|
Android开发
Android studio中的调试(Debug)按钮具体用法
Android studio中的调试(Debug)按钮具体用法
120 0
|
8月前
|
XML Android开发 数据格式
Android 动画之帧动画(也叫图片动画)的用法
Android 动画之帧动画(也叫图片动画)的用法
148 0
|
8月前
|
Android开发
Android 中实现上下文菜单(Context menu)详解
Android 中实现上下文菜单(Context menu)详解
42 0
|
8月前
|
Android开发
Android 中String.format()的用法
Android 中String.format()的用法
54 0
|
8月前
|
Android开发
Android onActivityResult()的属性与用法
Android onActivityResult()的属性与用法
94 1