android自定义menu,PopUpWindow弹出菜单

Android编程实现自定义PopupMenu样式示例【显示图标与设置RadioButton图标】 本文实例讲述了Android编程实现自定义PopupMenu样式。分享给大家供大家参考,具体如下: PopupMenu是Android中一个十分轻量级的组件。与PopupWindow相比,PopupMenu的可自定义的能力较小,但使用更加方便。 先上效果图: 本例要实现的功能如下: 1.强制显示菜单项的图标。 默认状态下,PopupMenu的图标是不显示的,并且Android没有为我们开放任何API去设置它的显示状态。为了显示菜单项的图标,可以自己重写PopupMenu并修改相关属性,也可以直接使用反射: try { Field field = popupMenu.getClass() 立即下载
 

使用PopupWindow来做自定义menu,往PopupWindow增加一个子View,子View的布局就是menu的布局。

出现和退出的动画:可以给PopUpWindow或它的子view添加。

网上所有用PopupWindow做的menu有个共同特点:就是点击menu键出现PopupWindow,然后再点击menu键无法使PopupWindow退出/dismiss()。

当给PopupWindow设置了setFocusable(true),menu显示后,点击menu其他任何地方,menu都会消失,但是这时候按钮的点击事件其实是不响应的。同时只响应键盘的返回键,其他按键均不响应,比如点击menu键,没有任何反应。

要解决这个问题很简单,就是给PopupWindow的子View设置下面的代码:

		//sub_view 是PopupWindow的子View
		sub_view.setFocusableInTouchMode(true);
		sub_view.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				// TODO Auto-generated method stub
				if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {
					mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行
					return true;
				}
				return false;
			}
		});


 记住,一定要给PopupWindow设置setFocusable(true),要不然点击menu其他地方以及返回键,menu都不会退出。且这时候是响应PopupWindow的parent的menu事件的。

下面阐述为什么这么写之后,当PopupWindow显示后,点击menu键PopupWindow会退出的原因:

首先得明白为什么给PopupWindow setFocusable(true)后,点击menu出现PopupWindow后再点击menu没反应的原因。

PopupWindow初始化的时候一般都指定了在哪个View上出现,我们称这个View为parent。parent里面写了点击menu出现PopupWindow的事件,如果给PopupWindow setFocusable(true),此时屏幕的焦点在PopupWindow上面,肯定是不会响应parent的按键事件的,它只会响应PopupWindow的按键事件。

但是PopupWindow的本质是Window,没有继承View类,自己没有onkeyDown或onkey或dispatchKey这些事件的。我刚开始试着实现这些接口,但是按键依然不响应,不知原因。因现在对按键的原理还不熟,无法阐述其原因。

然后我想绕道而行,就是给PopupWindow的子View注册按键事件,setKeyListener,刚开始我在子View的xml设置了android:focusable=”true” 但按键事件依然不响应。。。。纠结啊纠结。。。然后没得办法,我google了所有关于PopupWindow的文章。。。最后终于被我发现。。。需要给PopupWindow的子View 设置setFocusableInTouchMode(true)。这时候按键事件就响应了。。。

 

下面附上完整代码:

    /*必须重写,否则点击MENU无反应  为了让他不显示,下面onMenuOpened()必须返回false*/
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add("menu");// 必须创建一项
		return super.onCreateOptionsMenu(menu);
	}
	/**
	 * 拦截MENU
	 */
	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		if(mPopupWindow != null){
			if(!mPopupWindow.isShowing()){
				/*最重要的一步:弹出显示   在指定的位置(parent)  最后两个参数 是相对于 x / y 轴的坐标*/
				mPopupWindow.showAtLocation(findViewById(R.id.linear_menu_parent), Gravity.BOTTOM, 0, 0);
			}
		}
		return false;// 返回为true 则显示系统menu
	}

    
    private void initPopuWindow(int menuViewID){
    	LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    	/*设置显示menu布局   view子VIEW*/
    	sub_view = mLayoutInflater.inflate(menuViewID, null);
    	/*第一个参数弹出显示view  后两个是窗口大小*/
    	mPopupWindow = new PopupWindow(sub_view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    	/*设置背景显示*/
    	mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_menu_popup));
    	/*设置触摸外面时消失*/
    	mPopupWindow.setOutsideTouchable(true);
    	/*设置系统动画*/
		mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
		mPopupWindow.update();
		mPopupWindow.setTouchable(true);
		/*设置点击menu以外其他地方以及返回键退出*/
		mPopupWindow.setFocusable(true);
		
		/** 1.解决再次点击MENU键无反应问题  
		 *  2.sub_view是PopupWindow的子View
		 */
		sub_view.setFocusableInTouchMode(true);
		sub_view.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				// TODO Auto-generated method stub
				if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {
					mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行
					return true;
				}
				return false;
			}
		});
		
		
		/*监听MENU事件*/
		menu = new View[3];
		menu[0] = sub_view.findViewById(R.id.menu_0);
		menu[1] = sub_view.findViewById(R.id.menu_1);
		menu[2] = sub_view.findViewById(R.id.menu_2);
		
		menu[0].setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// doSomething
				
			}
		});
		
		menu[1].setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// doSomething
				
			}
		});
		
		menu[2].setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// doSomething
				
			}
		});
    }


 

网上有模仿UCweb的自定义menu的源码,下面是三个比较经典的文章:

  1. Android提高十八篇之自定义Menu(TabMenu)
  2. 【源码发布】仿UCWEB7.4界面最新Menu菜单 源码放出~!
  3. 模仿UCweb菜单

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战 本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。 阅读详情

相关推荐

Halcon手眼标定实战:从九点标定到机械臂精准抓取(附完整代码)

本文详细介绍了Halcon手眼标定技术在实际工业场景中的应用,重点讲解了九点标定法在机械臂精准抓取中的实现步骤和优化技巧。通过对比Eye-to-Hand和Eye-in-Hand两种模式的特点,提供完整的代码示例和误差分析,帮助工程师快速掌握标定技术,提升自动化系统的精度和稳定性。

weixin_29100927的博客 460

安卓开发弹出式菜单的四种方案(使用PopupMenu及第三方组件)

简要介绍 UI设计需要开发弹出式菜单,大致效果如下: 实现方案 方案一: 原生方式(最简单调用) main_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu1" android:title="...

蓝不蓝编程 7588

SAP BO系统启用邮件发送功能

目录 背景 维护邮件目标 启用邮件功能 背景 为了将BO报表或BO预警信息发送给特定的收件人,需要启用SAP BO系统的邮件发送功能。 维护邮件目标 1. 登录BO系统的中央管理控制台(CMC): http://<bo server name>:<port>/BOE/CMC 2. 点击“Organize”底下的“Servers”按钮进入BO服务器界面: 3. 点击“Servers List”进入服务器列表界面,右键点击JobServer&lt.

guowenming001的博客 1963

Android | PopupMenu自定义简单样式

Android | PopupMenu自定义简单样式

qq_61551948的博客 823

模型性能评估之 Friedman 检验与 Nemenyi 后续检验

前言 当我们提出一种算法,需要知道我们的算法和现在已有的算法相比,性能是否更优的时候,就需要用到模型性能评估的方法。本篇博客介绍一种模型性能评估的方法:Friedman 检验与 Nemenyi 后续检验。 该方法的特点是:可以进行多个算法的比较。下面看看具体的使用: 具体使用 1. 计算序值 假定我们用 D1D_1D1​、D2D_2D2​ 、D3D_3D3​ 和 D4D_4D4​ 四个数据集对算法 AAA、BBB、CCC 进行比较。首先需要得到每个算法在每个数据集上的测试结果,可以是准确率,也可以是均方误差

蕾欧娜与26的博客 1万+

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1414

Android基础之响应Menu键弹出菜单Demo

对于Android我也不是很熟悉,只是学习一些基本内容就OK.所以写的内容也很简单.本Demo要实现的效果就点击Menu键将弹出一个菜单并响应点击菜单项事件. 一、废话少说直接上代码.其实就是重写两个父类的方法即可如下: private static final int ItemIndex = Menu.FIRST+1; @Override public boolean onCre

源码剖析之COCOS2D-X 1836

用AList挂载网盘,无损看VR电影教程,无需下载到PICO头显本地!

用AList挂载网盘 + WebDAV直连头显,看片像拉本地一样流畅,不怕卡顿、不怕没空间,简直是VR看片刚需配置!别再用U盘传电影了,用AList + WebDAV,直接流畅看4K,看片效率翻倍,体验提升一个档次!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 5546

android 自定义PopupMenu详解

PopupMenu 使用及自定义样式 Activity引用的XML样式配置  android:theme="@style/AppBaseTheme" &lt;style name="AppBaseTheme" parent="AppTheme"&gt; &lt;item name="popupMenuStyle"&gt;@style/myPopupMenu&l

SherwinOne的博客 4793

1 初识智能化测试

非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。

Criss@陈磊 2626

倍福PLC--PERSISTENT断电保持数据和BOOT中各文件对应的解析

将D:\TC3程序\TwinCAT Project146\TwinCAT RT(x86)\Plc 文件夹的中三个替换文件复制到:G:\TwinCAT\3.1\Boot\Plc完成替换,如下图。(2) 找到程序所存的路径,编程电脑的D:\TC3程序\TwinCAT Project146路径下,并选择对应系统平台TwinCAT RT(x86)(3) 控制器断电,拔出内存卡,使用读卡器,在编程电脑中打开:(本次测试读卡器为G盘)(5) 开机完成后,TwinCAT自动运行,当前闪灯频率为50ms。

weixin_41883890的博客 2344

android自定义menu,PopUpWindow弹出菜单 .

使用PopupWindow来做自定义menu,往PopupWindow增加一个子View,子View的布局就是menu的布局。 出现和退出的动画:可以给PopUpWindow或它的子view添加。 网上所有用PopupWindow做的menu有个共同特点:就是点击menu键出现PopupWindow,然后再点击menu键无法使PopupWindow退出/dismiss()。 当给PopupW

u010482217的专栏 917

人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理

C++、Python、ONNX、人工智能、异常检测、Anomalib 2.1.0

FriendshipTang的博客 170

Andriod studio 学习 之 Menu菜单与PopupWindow弹出窗体

Menu菜单与PopupWindow弹出窗体 Menu菜单 常用的菜单 1.系统菜单OptionsMenu 在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id=...

Young_cloud的博客 718

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

第二天

自定义对话框和菜单自定义对话框创建自定义类继承AlertDialog设置按钮的监听menu菜单menu布局OptionsMenuContextMenu弹出菜单PopupWindow窗口 自定义对话框 创建自定义类继承AlertDialog 在主页面设置点击事件 private TextView title;//标题 private TextView message;//消息内容 p...

weixin_46361828的博客 158

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android Menu菜单 和 PopupWindow

android Menu菜单 PopupWindow窗口一、常用菜单1.系统菜单OptionsMenu2.上下文菜单ContextMenu3.弹出菜单二、PopupWindow 一、常用菜单 1.系统菜单OptionsMenu 1.在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.andro

muzi9928的博客 884

Menu菜单和PopupWindow窗口

Menu菜单和PopupWindow窗口Menu菜单系统自带菜单系统菜单的布局属性系统菜单的逻辑代码上下文菜单ContextMenu弹出菜单弹出菜单的逻辑代码弹出菜单的布局代码 Menu菜单 系统自带菜单 OptionsMenu这个是系统的菜单,可快速的在应用的右上方使用 系统菜单的布局属性 <?xml version="1.0" encoding="utf-8"?> <menu...

apple17625040076的博客 193

Android Studio 1-2 Menu菜单与PopupWindow 窗口

Android Studio 1-2一、Menu菜单1.系统菜单 OptionsMenu2.上下文菜单 ContextMenu3.弹出菜单二、PopupWindow 窗口 一、Menu菜单 1.系统菜单 OptionsMenu package com.example.day02ex; import androidx.annotation.NonNull; import androidx.appc...

v1141261428的博客 617

Menu popupWindow

Menu popupWindow系统菜单上下文菜单弹出菜单popupWindow 相对于兄弟控件popupWindow 相对于父亲控件 系统菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_item,menu);...

weixin_43863384的博客 591

Menu菜单和PopupWindow和双击退出

day002Menu菜单系统菜单上下文菜单弹出菜单PopupWindow双击退出 Menu菜单 系统菜单 先创建res中创建一个menu资源包 //系统菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); }

weixin_52360287的博客 236

Menu菜单与PopupWindow弹出窗体

Menu菜单与PopupWindow弹出窗体Menu菜单一.常用的菜单1.系统菜单OptionsMenu步骤流程:2.上下文菜单ContextMenu步骤流程:3.弹出菜单PopupWindow弹出窗体一.PopupWindow介绍二.如何自定义窗体三.实现微信QQ支付宝右上角加号弹出窗体1.步骤流程: Menu菜单 一.常用的菜单 1.系统菜单OptionsMenu 步骤流程: 1.在res下...

SingleTigerkin的博客 862

第2天Menu菜单和PopupWindow窗口

https://blog.youkuaiyun.com/qq_34178710/article/details/84992873

shuai_ge_feng的博客 3861
上一篇: 利用Android 2.2新特性完成缩略图(二)
下一篇: 两个Activity间传递list<bean>对象
Admin_
博客等级 码龄16年 28粉丝 32原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值