1.
直接添加下面两行代码
popupWindow.setOutsideTouchable(true);
这个函数的意义,就是指,PopupWindow以外的区域是否可点击,即如果点击PopupWindow以外的区域,PopupWindow是否会消失。
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
设置popUpWindow外部可点击,并设置背景,此时在原来的view之上生成一个派生自FrameLayout的PopupViewContainer,
将view作为PopupViewContainer的子布局,PopupViewContainer会捕捉KeyEvent.KEYCODE_BACK事件。
2.
首先在 popupWindow的布局文件(*.xml)中随意选取一个不影响任何操作的 View,推荐使用最外层的 Layout。
然后设置该 Layout 的 Focusable 和 FocusableInTouchMode 都为 true。
接着回到代码中,获取该 View 的实例,
现在你就可以对该 View 重写 OnKeyListener() 事件了。
我们可以手动捕获 KEYCODE_BACK 给对话框 dismiss()。
privatePopupWindow pw; privateView view; privateLinearLayout layMenu; LayoutInflater inflater = (LayoutInflater) main.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.popup_main_menu,null, false); layMenu = (LinearLayout) view.findViewById(R.id.layMenu); pw =new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,true); layMenu.setOnKeyListener(newOnKeyListener() { publicboolean onKey(View v, intkeyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK) pw.dismiss(); returnfalse; } });