首页 > 其他分享 >Android 中选项菜单(Option menu)的用法

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

时间:2022-11-17 10:32:42浏览次数:53  
标签:菜单 Option featureId menu item 菜单项 Android android

先看下效果:

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


菜单在程序中使用颇为广泛,几乎所有的桌面应用都含有菜单。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:组内的重要性顺序

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


标签:菜单,Option,featureId,menu,item,菜单项,Android,android
From: https://blog.51cto.com/u_15880918/5860080

相关文章

  • Android 中实现上下文菜单(Context menu)详解
    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,......
  • 使用Android Studio创建安卓项目详细步骤
    安装好AndroidStudio后,我们打开它  主界面——NewProject创建一个新项目 选择一个Empty Activity 空项目点击Next继续  根据图中指示填好信息点击Fi......
  • Android13.0的activity启动流程
    基于Android13.0相关源码:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javaActivityStarter.javaRootWindowContainer.j......
  • 001-STM32F407+EC200基本控制篇(阿里云物联网平台)-C#,网页,android,微信小程序,单片
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTE_STM32F407/EC200/aliyun.html"frameborder="0"scrolling="auto"width="100%"height="1500"><......
  • el-menu 菜单不高亮
    问题在部分页面el-menu的菜单栏不会高亮。分析初步分析是default-active的默认路径和当前页面的路由地址不同。打印下来果然——默认激活的路径中把中文转码了。......
  • Android 多module情况下module依赖aar问题处理
    原文:Android多module情况下module依赖aar问题处理-Stars-One的杂货小窝问题描述负责一个大项目Android工程项目,新增了一个module,而此module由于sdk的关系,需要引入SDK......
  • MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇
    背景MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不......
  • android手机无线调试
    1。手机与电脑先通过usb链接2.adbdevices查看是否链接成功(链接成功会显示设备列表)3.adbtcpip5555(0-65535之间取值,默认5555输进去)5:断开数据线,查看手机ipadbconnect1......
  • Qt For Android
    一、总结(新手必看)目的:在毕业设计中写一个手机软件来控制我自己开发的智能家居小型模拟系统,希望通过QT写程序,然后将编译生成的文件能够发送到我的手机上安装之后运行。最开......
  • android实现json的解析
    新建一个Person类/***CreatedbyMr.Chan*Time2022-11-15*Bloghttps://www.cnblogs.com/Frank-dev-blog/*/publicclassPerson{privateStringid......