PopupWindow 按menu键时的弹出和关闭_蒲锦_up的博客-程序员宅基地

技术标签: android 使用  menu  

添加状态变量,判断弹出框的状态,并初始化:

private boolean popupFirst = true;

在onkeyDown()中对menu键进行监听:

// 按下menu键,就弹出
		if (keyCode == KeyEvent.KEYCODE_MENU) {
			if (popupFirst) {
				initPopWindow();
			}
		}
		return true;

初始化弹出框的关键代码:

popView.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				// TODO Auto-generated method stub
				if ((keyCode == KeyEvent.KEYCODE_MENU) && (popWind.isShowing())) {
					if (!popupFirst) {
						popWind.dismiss();
						popupFirst = true;
					} else {
						popupFirst = false;
					}
				} else if ((keyCode == KeyEvent.KEYCODE_MENU)
						&& !(popWind.isShowing())) {
					// 显示弹出框
					popWind.showAtLocation(popView,
							Gravity.RIGHT | Gravity.TOP, 20, 20);
				}
				return false;
			}
		});

在onkeyListener()对menu注册监听,根据状态变量判断当前弹出框的状态,并作出弹出或者注销的动作。


对消失的状态添加监听:

popWind.setOnDismissListener(new OnDismissListener() {

			@Override
			public void onDismiss() {
				// TODO Auto-generated method stub
				popupFirst = true;
			}
		});
这样,在消失的时候,重置状态变量,下次点击的时候才能准确的弹出来。因为窗体的消失,有可能是按其他控件或者menu键消失掉的,显然按控件消失的话,状态变量是不会改变的。

整个活动:

public class TestPop extends Activity {
	private boolean popupFirst = true;

	private PopupWindow popWind;
	private View popView;

	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acypop);

		button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				initPopWindow();
			}
		});
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if (keyCode == KeyEvent.KEYCODE_MENU) {
			if (popupFirst) {
				initPopWindow();
			}
		}
		return true;
	}

	public void initPopWindow() {
		popView = LayoutInflater.from(this).inflate(R.layout.line, null);
		popView.setFocusable(true);
		popView.setFocusableInTouchMode(true);
		popView.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				// TODO Auto-generated method stub
				if ((keyCode == KeyEvent.KEYCODE_MENU) && (popWind.isShowing())) {
					if (!popupFirst) {
						popWind.dismiss();
						popupFirst = true;
					} else {
						popupFirst = false;
					}
				} else if ((keyCode == KeyEvent.KEYCODE_MENU)
						&& !(popWind.isShowing())) {
					// 显示弹出框
					popWind.showAtLocation(popView,
							Gravity.RIGHT | Gravity.TOP, 20, 20);
				}
				return false;
			}
		});
		popWind = new PopupWindow(popView, LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		popWind.setOnDismissListener(new OnDismissListener() {

			@Override
			public void onDismiss() {
				// TODO Auto-generated method stub
				popupFirst = true;
			}
		});
		// 使其聚集,可以点击里面的组件
		popWind.setFocusable(true);
		// 设置允许在外点击消失
		popWind.setOutsideTouchable(true);
		// 点击back也能消失
		popWind.setBackgroundDrawable(new BitmapDrawable());
		popWind.showAtLocation(popView, Gravity.RIGHT | Gravity.TOP, 20, 20);
	}
}

布局中只有个按钮,点击按钮也弹出窗体。


注意:

        1.外层的view获取焦点才能使onkeyListenner()监听起效。

popView.setFocusable(true);
		popView.setFocusableInTouchMode(true);

        2.首先是onkeydown()捕获焦点,然后才是onkeyListenner()。而onkeydown()不响应弹出框的时候,后面的也不会响应。返回false也没法。所以才加的状态变量来判断的。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yueqinglkong/article/details/25032447

智能推荐

微信小程序—点击navigator中的子元素同时,防止跳转_阵雨丶的博客-程序员宅基地

前期代码:<navigator hover-class="none" url=''> <view>内容</view> <view bindtap='telChange'>拨打电话</view></navigator>telChange: function (e) { wx.makeP...

【数值预测案例】(6) LSTM、GRU 时间序列股票数据预测,附TensorFlow完整代码_立Sir的博客-程序员宅基地

大家好,今天和各位分享一下如何使用循环神经网络 LSTM 和 GRU 完成对股票数据的预测。GRU 是在 LSTM 基础上的简化,将 LSTM 内部的三个闸门简化成两个,往往 GRU 的计算效果会优于 LSTM1. 导入工具包如果没有电脑没有GPU的话就把下面那段调用GPU加速计算的代码删了import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplot

4位数码管,带小数显示方法_aip650_Over-Lord的博客-程序员宅基地

说明4位数码管,带小数点,最大显示整数位9999;最多显示3位小数,例:0.123。#define HAL_DIGITAL_TUBE_MUTIPLE (1000) //可以改为10的整数倍倍数, 放大倍数, 要显示1.234,请输入1234#define HAL_DIGITAL_TUBE_DISPLAY_HZ (5) //自动刷新频率,可以关闭代码#ifdef PRINT_HEADER#undef PRINT_HEADER#endif#define PRINT_HEADER "D

R与SAS、SPSS的比较_weixin_34174132的博客-程序员宅基地

http://blog.sina.com.cn/s/blog_597fcb450100c3um.html 【转】R与SAS、SPSS的比较  (2009-03-05 20:29:40)转载标签: 教育分类: 学习R与SAS、SPSS的比较R语言R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 R 是统计领域广泛...

编写高性能 Web 应用程序的10个技巧 (转)_dhz43885的博客-程序员宅基地

本文来自:http://www.vckbase.com/document/viewdoc/?id=1359本文使用下列技术:ASP.NET,.NET 框架,IIS  用 ASP.NET 编写 Web 应用程序其轻松程度令人难以置信。它是如此的容易,以至于许多开发人员不用花费多少时间来构筑其应用便能获得非常好的性能。在本文中,我将给出10个编写高性能 Web 应用的技巧。我的评论不仅仅...

Laravel引入第三方库的方法_lxw1844912514的博客-程序员宅基地

https://blog.csdn.net/will5451/article/details/524726951、首先在app目录下创建一个新的文件夹,命名libs(可自定义)2、(可选)考虑到后面可能会引用很多库,so,在libs下再创建一个phpQuery文件夹3、找到根目录下的composer.json文件4、找到composer.json中定义的(看我备注)...

随便推点

ios rsa java_RSA IOS和Java_未知选手的博客-程序员宅基地

整了三天 终于可以相互加密解密了,今天我给大家讲讲我遇到的大坑。这篇文章只是做一个整理,帮大家理清一下步骤的而已在ios端做证书 来实现我们和java的交流 需要4个文件。一、首先,打开Terminal, 生成必要的公钥、私钥、证书:openssl genrsa -out private_key.pem 1024openssl req -new -key private_key.pem -out ...

centos7下php-fpm多实例运行开机自启动配置_小卒过河0104的博客-程序员宅基地

在centos7中,/etc/rc.d/rc.local文件的权限被降低了,没有执行权限,需要给它添加可执行权限。chmod +x /etc/rc.d/rc.local然后就可以在里面添加你要开机自启的命令了vi /etc/rc.d/rc.local承接上篇文单的配置文件 www.conf,www1.conf,www2.conf添加php-fpm执行命令如下:/usr/sbin...

文献学习(part17)--Correlation Adaptive Subspace Segmentation by Trace Lasso_GoatGui的博客-程序员宅基地

学习笔记,仅供参考,有错必纠文章目录Correlation Adaptive Subspace Segmentation by Trace Lasso摘要介绍相关工作贡献Trace Lasso相关自适应子空间分割有噪声数据的CASS有噪声数据的CASS分组效应最优化伪代码Correlation Adaptive Subspace Segmentation by Trace Lasso摘要研究了子空间分割问题。给定从子空间的并集提取的一组数据点,目标是将它们划分到它们所提取的底层子空间中。以光

java--swing组件_我是马克思小清新的博客-程序员宅基地

swing常见的组件窗体(JFrame)面板(Jpanel) 按钮(JButton) 文本框(JTextFiled)密码框(JPasswordField)标签(JLable) 复选框(JCheckBox)单选框(JRadioButton) 下拉框(JComboBox) 列表(JList)滚动窗格(JScrollpane)   ...

大数据Linux命令之文件查看大小、系统情况命令、压缩与解压_仙人掌仙人的博客-程序员宅基地

一、实时查看文件内容Linux 中有一个tail命令,常用来显示一个文件的最后n行文档内容但更多情况下,我们要在服务器端运行程序,并且需要实时监控运行日志,这时候有什么办法实时滚动显示log文件内容?这里可以利用tail命令加参数f实现:tail用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。tail -f xxx.log (会把文件里最尾部的内容显示在屏...

树莓派4b安装docker报错解决_illegal option --version_BoJack_Horse的博客-程序员宅基地

树莓派安装docker参考:  方法1:官方文档(脚本直接安装)  方法2:官方版本中译(嫌上一个麻烦的可以直接看这个)  方法3:非脚本安装方法  方法4:2&3自己树莓派操作系统命令:lsb_release -a结果:No LSB modules are available.Distributor ID: RaspbianDescription: Raspbian GNU/Linux 10 (buster)Release: 10Codename: buste

推荐文章

热门文章

相关标签