当触摸屏幕外部时,如何关闭弹出窗口

4
我希望您能在PopupWindow外部触摸时关闭它,我从这个SO问题中获取了答案。 链接在这里 他们建议添加以下两行代码。
myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);

现在当我点击PopupWindow外部时,弹出窗口会消失。

setOutsideTouchable(true);单独使用不起作用,但是当我设置背景Drawable时,它就可以正常工作了。 这是如何做到的?是否有人能解释一下?

new BitmapDrawable()已经被弃用。是否有任何替代方案?


由于new BitmapDrawable()已被弃用,您可以使用ColorDrawablemyPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - Gopal Gopi
是的,它正在工作。您能告诉我如何在设置背景可绘制对象时使弹出窗口消失吗? - saravanan
抱歉...我不知道那个... - Gopal Gopi
3个回答

0

尝试下面的代码:

myPopupWindow.setCanceledOnTouchOutside(true);
myPopupWindow.setCancelable(true);

1
我正在使用PopupWindow而不是Dialog。对于PopupWindow,这两种方法都未定义。 - saravanan
我已创建如下的popupWindowPopupWindow popup = new PopupWindow(mContext); popup.setContentView(layoutPopup); popup.setWidth(850); popup.setHeight(550); popup.setFocusable(true); //清除默认透明背景 popup.setBackgroundDrawable(view.getResources().getDrawable( R.drawable.white_color_patch));这对我来说完美地运行。 - The Heist
所以,另一种选择是 popUp.setFocusable(true); - The Heist
popUp.setFocusable(true); 只有在使用 setBackgroundDrawable 时才有效。但我不知道当我设置 backgroundDrawable 时发生了什么神奇的事情。 - saravanan

0
使用TouchInterceptor来关闭弹出窗口:
private LayoutInflater inflater;
private PopupWindow pw;
private View popupView;

inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
popupView = inflater.inflate(R.layout.popup_layout, null, true);
pw = new PopupWindow(popupView,750,500,true);
pw.setBackgroundDrawable(new BitmapDrawable());

pw.setTouchInterceptor(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {

                    pw.dismiss();

                    return true;
                }
        return false;
    }
});

pw.showAtLocation(findViewById(R.id.main_layout),Gravity.BOTTOM, 3, 35);

k. 你可以贴出弹出窗口的完整代码吗? - Yugesh
最终的PopupWindow addToOrderDialog = new PopupWindow(layout,android.view.ViewGroup.LayoutParams.MATCH_PARENT,android.view.ViewGroup.LayoutParams.WRAP_CONTENT);addToOrderDialog.setContentView(layout); addToOrderDialog.setBackgroundDrawable(new BitmapDrawable()); addToOrderDialog.setOutsideTouchable(true); - saravanan
@saravanan,请查看我编辑过的答案,这个也不起作用。请回复。 - Yugesh

0

将您的弹出窗口设置为全屏透明的“根”可点击布局,然后使用尺寸(popup.setWidth(850); popup.setHeight(550))在其中添加您的弹出窗口。还要使根透明布局可点击,这样您就会知道用户触摸了“外部”,因为对于用户来说,只有弹出窗口是可见的。这是根布局:

final LinearLayout contentLayout = new LinearLayout(activity);
contentLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
contentLayout.setOrientation(LinearLayout.VERTICAL);
contentLayout.setClickable(true);
contentLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        dismissPopup();
    }
});

现在你只需要将弹出窗口添加到该布局中即可。为什么这种方式更好呢?因为你可以设置contentLayout的背景颜色,以实现使整个屏幕被弹出窗口遮蔽的效果,这样用户就能清楚地看到只有弹出窗口是模态和活动的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接