显示弹出窗口时未调用onBackPressed

时间:2013-07-15 13:20:17

标签: android

我想在显示弹出窗口时处理后退。在某种程度上我想解雇它,在某些情况下我不想在弹出窗口中执行某些任务。

当弹出窗口显示时,不会调用Activity onBackPress。那么当弹出窗口显示时,如何捕获反压事件?

5 个答案:

答案 0 :(得分:6)

您需要在setBackgroundDrawable()上致电PopupWindow,并将背景设置为非null。这听起来很奇怪,但如果background上没有设置PopupWindow,那么它就无法检测来自Activity的事件,例如触摸窗外或返回按钮按下。

几天前我遇到了同样的问题。我会尝试找到SO答案,有人解释为什么会这样,但可能需要我一点点。在此期间,试试它应该有效。

Found it

我没有机会测试它,但您可以尝试添加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();
        }
    });