在弹出窗口外单击时,如何关闭弹出窗口?

How do I enable a popup to close when clicked outside of it?

我正在尝试制作一个弹出窗口,其中将包含文本字段和信息以询问用户,但我想知道如何制作它以便用户可以通过在主片段所在的弹出窗口外部单击来关闭它/ activity 是。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.tabstudygroups, container, false);

        listview = (ListView) rootView.findViewById(R.id.clist2);
        addCourseButton = (Button) rootView.findViewById(R.id.caddcoursebutton);

        // do stuff here

        addCourseButton.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onClick(View v) {
        if(v == addCourseButton) {
            View popupView = LayoutInflater.from(getActivity()).inflate(R.layout.popup_layout, null);
            final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

            // HERE IS WHAT I THOUGHT WOULD MAKE IT BE ABLE TO ENABLE THE OUTSIDE TOUCH
            popupWindow.setBackgroundDrawable(new BitmapDrawable());
            popupWindow.setOutsideTouchable(true);

            Button btn = (Button) popupView.findViewById(R.id.button);

            popupWindow.showAsDropDown(popupView, 0, 0);
        }
    }
}

你试过了吗setCanceledOnTouchOutside

通常您会使用对话框和 OnCancelListener 来执行此操作。如果你想要弹出窗口的灵活性,你可以通过将它设置在可触摸之外来获得相同的东西,然后调用 setTouchInterceptor 来拦截触摸。如果触摸在 window 内,请记住将 return 设置为 false,这样它将沿着触摸链向下到达实际视图。

将您的 PopupWindow 设置为 wrap_content 并使其可聚焦。

final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);

            // HERE IS WHAT I THOUGHT WOULD MAKE IT BE ABLE TO ENABLE THE OUTSIDE TOUCH
            popupWindow.setOutsideTouchable(true);
            popupWindow.setFocusable(true);
            popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


            Button btn = (Button) popupView.findViewById(R.id.button);

            popupWindow.showAsDropDown(popupView, 0, 0);

您可以使用 setCanceledOnTouchOutside(true) 在用户触摸弹出窗口之外时关闭弹出窗口。

Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);

让弹出 window setTouchable 为 true,setTouchInterceptor 并得到 return false,然后您可以在弹出 window 之外单击以关闭它。

popWindow.setTouchable(true);
popWindow.setTouchInterceptor(new View.OnTouchListener() {
    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }
});

如果不行,请告诉我,我会看到我错过的。

这个答案和 Gabe Sechan 的答案很相似,只是我在 post 这个答案之前没有发现...

确保 popupWindow.showAsDropDown(popupView, 0, 0); 在这些之后 popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));