记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon

2023-11-18


在这里插入图片描述

壹、Popupmenu的基本使用,定义和获取对应的menu菜单项。

  • 首先我们来定义一个menu.xml来放我们的菜单项目。
	menu xmlns:app="http://schemas.android.com/apk/res-auto"
		xmlns:android="http://schemas.android.com/apk/res/android" >
		<item
			android:id="@+id/changeIO"
			android:orderInCategory="120"
			android:icon="@drawable/changeio"
			android:title="切换进出方向" />
	
		<item
			android:id="@+id/workstart"
			android:orderInCategory="120"
			android:icon="@drawable/work"
			android:title="出工" />
		<item
			android:id="@+id/workfinish"
			android:orderInCategory="120"
			android:icon="@drawable/finishwork"
			android:title="收工" />
		<item
			android:id="@+id/rollcall"
			android:orderInCategory="120"
			android:icon="@drawable/rollcall"
			android:title="点名" />
		<item
			android:id="@+id/areactrl"
			android:orderInCategory="120"
			android:icon="@drawable/areactrl"
			android:title="零星流动" />
	</menu>
  • 然后我们直接把菜单按钮设置监听,在里面定义popupmenu。获取表单信息即可。下面两行代码放进去就行。功能就是点击图标按钮即可弹出菜单。
        private View.OnClickListener ioSwitcherListener = v -> {
        PopupMenu popupMenu = new PopupMenu(FaceActivity.this, v);       //FaceActivity是当前使用类
        popupMenu.getMenuInflater().inflate(R.menu.face_menu, popupMenu.getMenu());
        popupMenu.show();      //关键,弹出菜单显示
        }
  • 我们来看看具体效果图吧。这是我之前啥效果都没加的时候。只列了两个选项。可以看到没有分割线。白白的很丑。我们后面爱继续优化吧。
    在这里插入图片描述

贰、Popupmenu设置字体风格和弹出定位。添加分割线。

  • 由于风格单调,我们需要把它弄得好看一点。做安卓的应该都做过按钮。和按钮这些一样。我们看可以单独为他定制一个style。在value文件夹里面新建itemstyle.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="mainStyle" parent="Theme.AppCompat">         <!--主风格、mainStyle-->
        <item name="android:dropDownListViewStyle">@style/popmenuDivier</item>
        <item name="android:textAppearanceSmallPopupMenu">@style/popmenuText</item>
        <item name="android:textAppearanceLargePopupMenu">@style/popmenuText</item>
    </style>
    <!--popmenu的字体颜色-->
    <style name="popmenuText">
        <item name="android:textColor">@color/white</item>
        <item name="android:textSize">20sp</item>
        <item name="android:gravity">center</item>
    </style>
    <!--popMenu分割线的颜色-->
    <style name="popmenuDivier">
        <item name="android:divider">@color/md_blue_600</item>
        <item name="android:dividerHeight">2sp</item>
    </style>
</resources>
  • 关于这个style文件,我具体还没摸清哪些风格对应的是啥。主风格里面嵌套其他风格。引用继承的关系。主风格parent网上的都是写的AppThem。我用这个无法编译。我开始把它删了。所有都可以用。这个parent其实可有可无。但是后面添加icon就出问题了。所以我才加了Theme.AppCompat。但是加了这个就无法使用popupmenu的背景、定位的自定义风格。目前没找到问题所在。希望后来的大佬知道的指点一下。因为我的也可以将就着用。我就没添加背景和定位!关于定位和背景需要的。大家可以参考一下这篇博客
  • 最后在对应使用的activity配置,例如我的是FaceActivity,把这一条添加到对应的activity就行了。
    在这里插入图片描述
  • 我们来看看具体效果图,添加了分割线,字体风格和Theme.AppCompat默认背景风格。到这一步差不多就是下面的风格。奇怪的是没有定位它默认跑到一个合理的位置上了,免去了定位的烦恼。
    在这里插入图片描述
  • 由于之前我没有继承parent。定位和背景也可以正常使用看看你我的先后对比图。这是没有设置定位和背景
    在这里插入图片描述
  • 这是设置了背景和定位的。这些在主风格都没继承parent的。可以看到就整齐美观了许多。
    在这里插入图片描述

叁、为Popupmenu添加icon:两种方法:反射、子菜单模式

a、利用反射强制展示icon。这里面有点坑。

  • 虽然定位,背景都设置了,但是还是觉得很丑。这时候我就尝试着为每个表单添加icon。也就是本文开始的那种效果。我搜了许多,都是用的反射显示。我也用的反射实现的。我们只需要在刚才定义popupmenu的后面加一段代码即可实现。
//使用反射,强制显示菜单图标
        try {
            Field field = popupMenu.getClass().getDeclaredField("mPopup");
            field.setAccessible(true);
            MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);
            mHelper.setForceShowIcon(true);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }finally {
            popupMenu.show();
        }
  • 说到这里我就有话要说了。由于之前项目比较老了。这个MenuPopupHelper死都不出来。android.support.v7.widget报找不到。检查发现我导的包和别人用的不一样。我又尝试添加了一下依赖。在这里插入图片描述
    结果解决了么,并没有!又报错了。编译失败,说我v4和v7冲突了。反正就是这个问题。最后检查发现在另一个build.gradle里面还有个v4.我把它注释了就好了。貌似v4和v7差不多。但是有重合的部分。网上说把冲突的jar删了即可。
    在这里插入图片描述

b、子菜单模式,不用反射,直接显示。

  • 利用表嵌套,当然具体还看需求而定。我还没尝试如何怎么调整显示为我想要的效果。但至少提供了一种思路。这是我在谷歌上找到的。百度上的都是利用那个反射强制显示的。这个就直接第一步的代码啥都不用加。
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:android="http://schemas.android.com/apk/res/android" >
	<item
		android:id="@+id/main"
		android:orderInCategory="120"
		android:title="主菜单" >
	<menu>
	<item
		android:id="@+id/changeIO"
		android:orderInCategory="120"
		android:icon="@drawable/changeio"
		android:title="切换进出方向" />

	<item
		android:id="@+id/workstart"
		android:orderInCategory="120"
		android:icon="@drawable/work"
		android:title="出工" />
	<item
		android:id="@+id/workfinish"
		android:orderInCategory="120"
		android:icon="@drawable/finishwork"
		android:title="收工" />
	<item
		android:id="@+id/rollcall"
		android:orderInCategory="120"
		android:icon="@drawable/rollcall"
		android:title="点名" />
	<item
		android:id="@+id/open"
		android:orderInCategory="120"
		android:icon="@drawable/areactrl"
		android:title="零星流动" />
	</menu>
	</item>
</menu>

在这里插入图片描述

肆、动态管理Popupmenu表单项。隐藏菜单中指定的选项。

  • 这个问题不知道是我没找到还是啥,各大网站没找到对应的解决方案。最后在谷歌找到的。一种是比较愚蠢的,添加所需的menu项.可以参照着我的menu.xml看。但是这个蠢就蠢在我费劲千辛万苦添上去的icon又不在了。变成了这个样子。
       popupMenu.getMenu().add(Menu.NONE, R.id.rollcall, Menu.NONE, "点名详情");
       popupMenu.getMenu().add(Menu.NONE, R.id.workfinish, Menu.NONE, "收工");
       popupMenu.getMenu().add(Menu.NONE, R.id.changeIO, Menu.NONE, "切换进出方向");

在这里插入图片描述

  • 另外就是比较nice的解决方案了。原理就是把他的显示参数设置为不可见。答案来自谷歌。手动笑哭!!我把其中两个隐藏了。这样我们就可以根据后端传过来的标识显示对应的menu项。最后效果:看着就会很nice !我特么把这生生搞成了进化史!哈哈
	   popupMenu.getMenu().findItem(R.id.rollcall).setVisible(false);
       popupMenu.getMenu().findItem(R.id.workfinish).setVisible(false);

在这里插入图片描述

伍、为Popupmenu菜单设置监听。

  • 最难的我们都经历了,剩下来这个就比较简单了。直接Switch就行了。哇,写累了直接上代码吧!手动滑稽!直接加在popupmenu.show后面就行
        popupMenu.setOnMenuItemClickListener(
            new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {                     
                        case R.id.rollcall:
                            Comm.loger.output("切换点名。");
                            break;
                        case R.id.workstart:
                            Comm.loger.output("切换出工。");
                            break;
                     //此处省略一万字
                        default:
                            // 隐藏该对话框
                            Toast.makeText(FaceActivity.this,
                                    "您单击了【" + item.getTitle() + "】菜单项"
                                    , Toast.LENGTH_SHORT).show();
                    }
                    return true;
                }
            });

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon 的相关文章

  • 移动开发期末大作业-备忘录app

    备忘录app 资源链接在文末 前言 2022年软件工程专业上学期的一个安卓的课设 开发工具 androidStudio 开发语言 Java 介绍 这是一个备忘录APP 具有基本的备忘录功能和云端同步功能 实现备忘录功能的部分借鉴了xmenw
  • Android Studio 界面显示不全问题

    最近想试试google的android studio开发工具 安装完成后 按照向导新建一个工程 发现向导界面太大 整个屏幕显示不过来 调整界面大小也无法搞定 我用的是ubuntu系统 笔记本分辨率为1366 768 上网百度了好多 发现不少
  • Android中Activity的开启Activity页面的跳转详解

    android开启和关闭activity 1 在android 中我们要开启和关闭activity按钮首先就要创建两个activity 2 然后在他们的布局文件中添加页面 3 然后使用java代码编写程序实现页面的开启和关闭 在MainAc
  • Android 避免耗时操作及解决办法

    Android耗时操作 我们可以通过几种方式实现 IntentService IntentService 与Service的不同之处在于IntentService是可以执行耗时任务的 而Service不能够执行耗时任务 否则会出现ANR异常
  • Android图表年度最强总结,一篇文章从入门到精通!

    说到Android图表 不得不说一说MPAndroidChart这个强大的开源图表库 至于有多强大 先给你看看实现的效果图 如果效果图成功地引起了你的注意 那么 嘿嘿嘿 当然是把这篇文章看完 最后再点个赞 文章目录 添加依赖 创建视图以及简
  • 蓝牙通讯

    蓝牙通讯 简介 蓝牙API 所需权限 使用蓝牙的步骤 普通调用案例 通讯案例 简介 蓝牙 是一种支持设备短距离通信 一般10m内 且无阻隔媒介 的无线电技术 能在包括移动电话 PDA 无线耳机 笔记本电脑等众多设备之间进行无线信息交换 利用
  • 安卓初学——界面按钮响应

    安卓学习 采用onClickListener监听器 界面按钮响应 一 定义监听 绑定组件 二 通过匿名内部类 把组件和事件绑定 三 采用view 对象调用onClick 四 在当前Activity实现监听接口 一 定义监听 绑定组件 自定义
  • 自学Android之路---笔记

    1 查看类的源码CTRL b 2 所有的活动即activity必须要在AndroidManifest xml中进行注册才能生效 3 布局多练习
  • android动静态申请IMEI或其他特殊权限(适配11)

    报错原因 今天又是撸代码的一天 人生第一个项目上架闪退被打回 很难受 打开就闪退 后面才恍然大悟 打开APP默认申请获取手机IMEI 测试用的手机被我手动打开了权限 所以一直没有注意这个问题 果然 log报错 java lang Secur
  • 将android项目生成library

    1 先将自己的项目改为library 在app下的build gradle下修改application为library 2 再将applicationId注销 3 点击 sync 4 进入项目文件夹 保留app文件夹 5 进入app文件目录
  • Android面试题内存&性能篇

    Android面试题内存 性能篇 由本人整理汇总 后续将继续推出系列篇 如果喜欢请持续关注和推荐 更多内容可以关注微信公众号 Android高级编程 android tech 系列文章目录 Android面试题View篇 Android面试
  • 使用我们的actionbar实现我们的tab导航功能(详解)

    第一步的话就是创建我们对应的fragment 这里的话我们创建了三个对应的fragment 第二步的话就是创建我们的mytablistener类 package com example handle Fragments import and
  • Delphi中如何查找并关闭弹出菜单?

    我在 Delphi 中有一个 MDI win32 应用程序 它有多种形式 所有形式及其内部组件都有自己的弹出菜单 一段时间后 当应用程序空闲时 触发器启动并关闭所有子窗口 但如果弹出菜单显示 它不会关闭它 例如 用户单击右键并离开计算机 当
  • 弹出菜单项图标

    我的应用程序有问题 我需要展示一个PopupMenu我需要此菜单中的每个项目都包含文本和图像 图像应显示在文本的左侧 但它没有显示 有什么建议如何实现它吗 我的代码到目前为止 public void showMenu Button butt
  • 如何在出厂重置后从 Android 恢复丢失的数据、照片、联系人

    什么是恢复出厂设置 恢复出厂设置是将电子设备恢复到制造商在工厂设置的原始状态 也称为主重置或硬重置 恢复出厂设置有什么作用 这样做将删除用户在设备上添加的所有数据 设置和应用程序 当手机需要出售 需要擦除个人数据或者遇到设备故障 病毒攻击
  • 自定义弹出菜单(布局)

    我正在尝试升级我的 PopupMenu 以便它带有图标和自定义样式 我为它创建了一个新的布局
  • PopupMenu 单击导致 RecyclerView 滚动

    我里面有一个溢出按钮CardView in Recyclerview 每当我单击按钮时 我都会显示一个弹出菜单 但也会显示RecyclerView正在向下滚动一项 谁能帮我停止这种不必要的滚动吗 基本上我试图复制与 Playstore 中相
  • 圆形图标弹出菜单的正确波纹效果形状

    在 Flutter 中 我想要使用圆形边框设计图标按钮的样式 并且让材质波纹效果正常工作 以便波纹效果包含在圆圈中 在以下代码中 第一个按钮可以正常工作 在第二个 弹出 按钮中 波纹效果延伸到围绕按钮的正方形 而不是局限于圆形边框 Mate
  • 如何更改 PopupMenu 项目的字体

    我想更改默认值font of 弹出菜单项目并使用我的自定义字体 这是我用来创建的代码弹出菜单 PopupMenu pm new PopupMenu this v getMenuInflater inflate R menu main pm
  • Python 3 Tkinter 菜单小部件的回调似乎不按顺序

    我在使用 Tkinter 时遇到问题Menu小部件 没有菜单按钮 因此回调似乎不按顺序运行 这里有一个very最小的例子 Python 3 6 5 Windows 7 x64 from tkinter import root Tk popu

随机推荐

  • 301跳转:http跳转https不带www跳转到带www

    写在 htaccess中 一 http跳转https RewriteCond SERVER PORT 443 RewriteRule https SERVER NAME 1 R 301 L 二 不带www跳转到带www RewriteCon
  • shell脚本-统计字符串中数字字母的个数

    bin bash read p 请输入一个字符串 str count1 0 count2 0 count3 0 count4 0 num str num for i in seq 0 num do ch str i 1 echo n ch
  • Mac 不小心断开移动硬盘导致磁盘无法读取和加载(顺利解决!)

    目录 1 问题 2 解决 2 1 终端中执行 diskutil list 2 2 输入 sudo diskutil mount dev disk0 disk1 disk2 同理 情况一 情况二 情况三 1 问题 不小心碰到USB插口 导致无
  • iOS证书(.p12)和描述文件(.mobileprovision)申请

    我们在做uniapp开发的时候 打包ios应用需要自有证书 而自有证书包含 p12和 mobileprovision这两个跟证书有关的文件 但是uniapp官方的教程 却是需要使用苹果mac系统去申请 假如没有mac电脑 则它的教程就没有参
  • Python pass 语句

    Python pass 是空语句 是为了保持程序结构的完整性 pass 不做任何事情 一般用做占位语句 Python 语言 pass 语句语法格式如下 pass 测试实例 usr bin python coding UTF 8 输出 Pyt
  • Spring boot实现Rest风格请求及底层原理

    Rest风格的介绍 如今各大公司都是使用restful风格来定义接口 restful也是一套接口的规范 restful可以使我们的接口更加简洁 快捷高效 透明 常见的Rest风格 CRUD 请求方式 对应属性 使用方式 GET 查询 表单请
  • 使用markedjs预览md文件

  • 神经网络时间序列预测PyTorch-Forecastin!

    来源 数据STUDIO 深度学习初学者 本文约5200字 建议阅读8分钟 本文为你介绍了神经网络时间序列预测PyTorch Forecastin PyTorch Forecasting 1 使用神经网络的时间序列预测对数据科学工作者和研究人
  • 地推里的t1结算啥意思

    T1结算 通常是指在地推活动中 结算员工提成的时间点 在这种情况下 T1代表第一天或第一周期的结算时间 即在活动结束后的第一天或第一周进行结算 例如 如果地推活动是在一个星期内进行的 那么T1结算可能是指在活动结束后的第一周内结算员工提成
  • 二叉树的创建和遍历实现

    1 前言 提到 树 Tree 结构 很容易联想到 大树 想到这是 一对多关系 特性的数据结构 其相关的名词 概念很多 子树 SubTree 结点 Node 根结点 Root 叶子 Leaf 终端结点 分支结点 非终端结点 内部结点 孩子 C
  • 在Windows2012下配置Mercurial

    所需的安装文件 xampp win32 1 8 3 4 VC11 installer exe python 2 7 7 amd64 msi tortoisehg 3 0 1 x64 msi mercurial 3 0 1 win amd64
  • windows下使用FFmpeg生成PCM音频文件并播放(通过命令的方式)

    一 PCM文件的定义 PCM文件 模拟音频信号经模数转换 A D变换 直接形成的二进制序列 该文件没有附加的文件头和文件结束标志 Windows的Convert工具能够把PCM音频格式的文件转换成Microsoft的WAV格式的文件 将音频
  • python 历险记(五)— python 中的模块

    目录 前言 基础 模块化程序设计 模块化有哪些好处 什么是 python 中的模块 引入模块有几种方式 模块的查找顺序 模块中包含执行语句的情况 用 dir 函数来窥探模块 python 的内置模块有哪些 结语 参考文档 系列文章列表 前言
  • 大千世界无奇不有,设计师又遇一无赖暴击!

    黑客技术 点击右侧关注 了解黑客的世界 Java开发进阶 点击右侧关注 掌握进阶之路 Linux编程 点击右侧关注 免费入门到精通 有网友发文感叹道 大千世界无奇不有 设计师又遇一无赖暴击 你们的设计我很满意 但是我不会付款的 为什么 你们
  • kylin: build cube Hbase: Region Server 意外退出

    背景 跑kylin 的 build cube 任务 总是在跑任务 数据量200M 的时候挂掉 各种调节yarn的参数都不行 关键跑的时候还没涉及到hbase 因为我跑的是kylin on druid 但是总是跑着跑着 直接ERROR 查看h
  • C++顺序检索、二分检索,并统计比较次数,体现最好、最差、平均三种情况

    实验四 include
  • vscode自动化写代码插件 自动生成代码插件

    直接在vscode中搜索chatGPT中文版安装即可 在代码仓中右侧 就去搜索你想要的代码啦 比如想搜索一个深拷贝
  • COW奶牛!Copy On Write机制了解一下

    前言 只有光头才能变强 在读 Redis设计与实现 关于哈希表扩容的时候 发现这么一段话 执行BGSAVE命令或者BGREWRITEAOF命令的过程中 Redis需要创建当前服务器进程的子进程 而大多数操作系统都采用写时复制 copy on
  • 分布式记账的意义

    今天正式开始 区块链方法论 的第二部分 寻根溯源 的第一章节 说到区块链 大多数的人说的最多的就是分布式记账 没错 分布式记账是区块链技术中最广为人知的特征之一 但几乎没有多少人知道为什么要采用分布式记账 所以 今天我们就来说一说分布式记账
  • 记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon

    今天就记录一下昨天写bug的时候使用Popupmenu的时候遇到的一些问题吧 尝试使用Popupmenu 避免不必要的坑 我贴的代码都是我最后的代码 记录自己看一下 后来参考的人就看看步骤就行 先看看我最后的效果图 壹 Popupmenu的