5

我想在显示弹出窗口时处理后按。在某些情况下,我想将其关闭,在某些情况下,我不想在弹出窗口中执行某些任务。

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

4

5 回答 5

6

您需要调用setBackgroundDrawable()您的PopupWindow并将背景设置为非null. 这听起来很奇怪,但如果background没有设置你的东西,PopupWindow那么它将无法检测到来自Activity诸如触摸窗口外部或按下后退按钮之类的事件。

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

找到了

我还没有机会对其进行测试,但您可以尝试添加 akeyEventListener并执行类似的操作

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK)
    {
         // put your code here
    }

并添加setOutsideTouchable(true)到您的PopupWindow对象并调用update()它。如果这不起作用,那么您可能只需要在显示弹出窗口时禁用后退按钮并将您自己的按钮添加Button到窗口中。我还没有找到任何其他可以让您从按下的后退按钮中获取事件的方法。

于 2013-07-15T13:22:29.593 回答
4

像这样设置背景可绘制

popup.setBackgroundDrawable(new BitmapDrawable());

然后像这样设置 OnDismissListener

popup.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                //do your code here
            }
        });
于 2015-09-23T13:24:50.263 回答
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
 }
于 2014-02-04T10:23:29.830 回答
1

我知道为时已晚,但它可以帮助别人。这样做有两种选择

1)如果弹出窗口焦点对您不重要,则设置

mPopupInfoWindow.setFocusable(false);

因为如果您的弹出窗口处于焦点状态,那么它不会将按下事件传递给活动,这就是不调用 onBackPressed() 方法的原因

2)如果弹出窗口焦点适合您,则让它为真并在弹出窗口中设置此侦听器。这段代码对我有用

 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;
        }
    });
于 2017-03-10T07:22:32.750 回答
0

我提出了一个您可以考虑的更简单的替代方案。其他方法对我不起作用。

解决原理:你的弹窗附近的所有按钮点击都会被拦截,但是任何BACK按钮都不会被拦截。因此,如果您的弹出窗口中有任何可以采取行动的内容,请在您调用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();
        }
    });
于 2020-05-23T13:04:36.163 回答