我想在显示弹出窗口时处理后退。在某种程度上我想解雇它,在某些情况下我不想在弹出窗口中执行某些任务。
当弹出窗口显示时,不会调用Activity onBackPress。那么当弹出窗口显示时,如何捕获反压事件?
答案 0 :(得分:6)
您需要在setBackgroundDrawable()
上致电PopupWindow
,并将背景设置为非null
。这听起来很奇怪,但如果background
上没有设置PopupWindow
,那么它就无法检测来自Activity
的事件,例如触摸窗外或返回按钮按下。
几天前我遇到了同样的问题。我会尝试找到SO答案,有人解释为什么会这样,但可能需要我一点点。在此期间,试试它应该有效。
我没有机会测试它,但您可以尝试添加keyEventListener
并执行此类操作
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
// put your code here
}
并将setOutsideTouchable(true)
添加到您的PopupWindow
对象并在其上调用update()
。如果这不起作用,那么您可能必须在弹出窗口显示时禁用后退按钮,并将自己的Button
添加到窗口中。我还没有找到任何其他内容可以让你从后面按钮中选择事件。
答案 1 :(得分:4)
像这样设置背景可绘制
popup.setBackgroundDrawable(new BitmapDrawable());
然后像这样设置OnDismissListener
popup.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
//do your code here
}
});
答案 2 :(得分:3)
final PopupWindow popup = new PopupWindow(context);
...
popup.setFocusable(false); //Setting this to true will prevent the events to reach activity below
popup.setBackgroundDrawable(new BitmapDrawable()); //Or anything else, not null!
然后在你的活动中:
@Override
public void onBackPressed() {
//your code
}
答案 3 :(得分:0)
我知道它太晚了,但它可以帮助别人。 这样做有两种选择
1)如果弹出窗口焦点对您不重要,请设置
mPopupInfoWindow.setFocusable(false);
因为如果您的弹出窗口处于焦点,那么它不会将按下事件传递回活动,这就是为什么不调用onBackPressed()方法
2)如果弹出窗口为您聚焦maters,则将其设为true并在弹出窗口中设置此Listener。这段代码适合我
mPopupInfoWindow.getContentView().setFocusableInTouchMode(true);
mPopupInfoWindow.getContentView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
mPopupInfoWindow.dismiss();
return true;
}
return false;
}
});
答案 4 :(得分:0)
我建议您考虑一个更简单的选择。其他方法对我不起作用。
解决方案原理:您的弹出窗口附近的所有按钮单击都将被拦截,但任何BACK按钮都将不会被拦截。因此,如果您的popupwindow中有任何内容可以采取措施,请在调用dismiss()之前设置一个指示。在您的setOnDismissListener()中执行一个额外的操作(例如getActivity()。popupBackStack())。
此解决方案的优点是您可以创建自己的CustomPopupWindow并实施此策略。您可以在自定义弹出窗口中隐藏此实现。
第1步:在弹出窗口的实例化附近添加:
boolean isClickHandled = false;
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ShapeDrawable());
popupWindow.setTouchInterceptor(new View.OnTouchListener() { // or whatever you want
@Override
public boolean onTouch(View v, MotionEvent event) {
isClickHandled = true;
return false;
}
});
如果您的popupWindow内部有按钮,请让setOnClickListener.onClick设置isClickHandled = true和dismiss()。
在您的onDismissListener中执行以下操作:
popupWindow.setOnDismissListener(() -> {
popupWindow.dismiss();
if ( !isClickHandled) {
MainActivity.mainActivity.getSupportFragmentManager().popBackStack();
}
});