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

private boolean popupFirst = true;

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

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

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

popView.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif ((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() {@Overridepublic void onDismiss() {// TODO Auto-generated method stubpopupFirst = true;}});

这样,在消失的时候,重置状态变量,下次点击的时候才能准确的弹出来。因为窗体的消失,有可能是按其他控件或者menu键消失掉的,显然按控件消失的话,状态变量是不会改变的。

整个活动:

public class TestPop extends Activity {private boolean popupFirst = true;private PopupWindow popWind;private View popView;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.acypop);button = (Button) findViewById(R.id.button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubinitPopWindow();}});}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (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() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif ((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() {@Overridepublic void onDismiss() {// TODO Auto-generated method stubpopupFirst = 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也没法。所以才加的状态变量来判断的。

PopupWindow 按menu键时的弹出和关闭相关推荐

  1. win10,打开软件时总是弹出询问关闭方案

    1.window 键加R 键打开"运行"对话框 ,复制输入命令msconfig,点确定,打开系统配置页面. 2.切换到"工具"选项卡,选中"更改UAC ...

  2. 三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。...

    (转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/lingu ...

  3. java 实现文件下载保存框_Java开发网 - 任何类型的文件下载时都会弹出文件保存框的实现(原创)...

    于 2002-12-12 11:09 :):):)任何类型的文件下载时都会弹出文件保存框的实现:(:(:( 简介: 从事WEB程序设计的朋友一定都遇到过这种情况吧,对于一些操作系统可以识别的文件类型如 ...

  4. vb屏蔽文本框点右键时的弹出菜单

    ----------以下代码在模块 程序代码: Option Explicit Public Declare Function SetWindowLong Lib "user32" ...

  5. 玩游戏的时候计算机弹出,电脑玩游戏时总是弹出输入法怎么办?

    原标题:电脑玩游戏时总是弹出输入法怎么办? 相信不少喜欢打游戏多小伙伴有遇到过这个一个烦人的情况:在我们电脑上激烈地进行游戏时,突然按键切换到了输入法打字上了,这时我们的游戏就被无法操作进而影响到游戏 ...

  6. windows访问文件服务器共享时不弹出输入用户名和密码窗口

    问题描述: 在客户端电脑,用非administrator本地用户登陆系统,访问文件服务器共享时没有弹出输用户名和密码的窗口,而是直接进入共享枚举,但没有任何访问权限.如果在客户端电脑用administ ...

  7. 双击SDK Manager.exe和AVD Manager.exe时,弹出提示:failed to execute tools\android.bat解决办法

    在Android的虚拟机上出现"no target selected",去android-sdk-windows里面双击SDK Manager.exe和AVD Manager.ex ...

  8. Android --- 进入页面时,不弹出软键盘。当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等

    功能需求: 1.进入页面时,不弹出软键盘 2.当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等 搜索百度测试: 1.百度上说用 editText.setInputTyp ...

  9. 浏览器显示无法解析服务器的DNS地址,使用搜狗浏览器时突然弹出无法解析服务器的DNS地址该如何处理...

    导语:小编也是搜狗浏览器的忠实粉丝,但是最近在使用浏览器的时候频频出现"无法解析服务器的DNS地址"的情况.为了修复这个故障小编也耗费了很多的时间,最后发现只要更改一个DNS就能够 ...

最新文章

  1. 代码居中对齐_一篇文章带你了解CSS对齐方式
  2. 仿即刻的点赞滚动放大波纹图标
  3. Nature:光解水催化剂效率接近100%!马斯克移民火星的能源和氧气这下有了
  4. ajax中能不能设置编码,ajax-如何在.getJSON jQuery中设置编码
  5. 安卓开发fragment报错_android开发 Fragment嵌套调用常见错误
  6. Python—day3
  7. No-3.Linux 终端命令格式
  8. 基于流的EXCEL文件导出,SXSSFWorkbook源码解析
  9. Android 系统(180)---Android.mk入门
  10. (万字长文)HashMap, ConcurrentHashMap 原理及源码详解 java1.7
  11. Arduino教程六—DS1302时钟模块
  12. 十三肝了2晚的《IDEA操作手册-终极秘籍》终于来了...
  13. 少儿编程scratch -- 基础篇
  14. java getday_javascript中Date对象的getDay方法使用指南
  15. PS效果——斜面浮雕
  16. 4.16周赛---玩游戏
  17. windows install clean up
  18. 常见的考勤管理系统有哪些功能?
  19. Android强行进阶,自定义控件—LayoutManager,android开发视频
  20. centos7安装配置yum软件仓库

热门文章

  1. 【测试工具】QTP简介
  2. 李响GIZA++运行报告
  3. 如何解决Keil下出现error: L6050U: The code size of this image exceeds the maximum allowed for this versio
  4. html中样式表的类型,css层叠样式表有哪几种类型?
  5. r语言 聚类求和_R语言聚类分析:k-means和层次聚类
  6. 当老板拖欠工资的时候....
  7. P6056 [加油武汉]SIR 模型 看似高深实则很水的题
  8. 国内七大免费网络硬盘横向评测
  9. 企业互联网专线该怎么选?
  10. RabbitMQ集群部署教程(Linux)