单击外部时如何关闭Android对话框(使用FLAG_NOT_FOCUSABLE)

Posted

技术标签:

【中文标题】单击外部时如何关闭Android对话框(使用FLAG_NOT_FOCUSABLE)【英文标题】:How to dismiss Android Dialog when click outside (using FLAG_NOT_FOCUSABLE) 【发布时间】:2020-09-26 21:32:42 【问题描述】:

我有一个对话框,当我点击它外部时我想将其关闭。但是,我不希望它接收按键事件,因为它是一个音量对话框,我希望活动能够接收按键音量上下事件。于是我设置了FLAG_NOT_FOCUSABLE,如下图:

    AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.MyDialogTheme);
    AlertDialog alert = builder.create();
    Window window = alert.getWindow();
    window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    alert.setView(view);

问题是,有了这个标志,我也不能让对话框在外部触摸发生时关闭。

How to dismiss the dialog with click on outside of the dialog? 上的所有解决方案(如 dialog.setCanceledOnTouchOutside(true);)在这种情况下都不起作用。

【问题讨论】:

【参考方案1】:

1 - 为对话框的窗口属性设置flag-FLAG_NOT_TOUCH_MODAL

Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

2 - 在 windows 属性中添加另一个标志,FLAG_WATCH_OUTSIDE_TOUCH- 这个标志用于对话框在其可见区域之外接收触摸事件。

3 - 覆盖onTouchEvent()of 对话框并检查操作类型。如果操作类型是“MotionEvent.ACTION_OUTSIDE”,则表示用户正在对话区域之外进行交互。因此,在这种情况下,您可以关闭对话或决定要执行的操作。查看普通版?

public boolean onTouchEvent(MotionEvent event)  
  

       if(event.getAction() == MotionEvent.ACTION_OUTSIDE)  
        System.out.println("TOuch outside the dialog ******************** ");  
               this.dismiss();  
         
       return false;  
  

【讨论】:

以上是关于单击外部时如何关闭Android对话框(使用FLAG_NOT_FOCUSABLE)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSFL 关闭字体替换对话框

如何在点击外部关闭 QDialog 并在点击子小部件时关闭?

Winforms:在对话框外单击时关闭模式对话框

当我单击搜索按钮时,防止 ProgressDialog 被关闭(Android)

单击外部弹出框时如何防止 UIPopoverPresentationController 被关闭?

在 ExtJS 4.1 中单击外部窗口时如何关闭窗口?