如何通过点击对话框的外部关闭对话框?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我已经为我的应用程序实现了一个自定义对话框。我想要实现的是,当用户单击对话框外部时,对话框将被关掉。我该怎么做?

提问于
用户回答回答于

dialog.setCanceledOnTouchOutside(true);如果在对话框之外点击,则可以使用它关闭对话框。

就像:

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

或者如果你的Dialog在非模型中,

FLAG_NOT_TOUCH_MODAL为对话框的窗口属性设置标志

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

将另一个标志添加到窗口属性,FLAG_WATCH_OUTSIDE_TOUCH- 这是一个对话框来接收其可见区域外的触摸事件。

3 - 覆盖onTouchEvent()对话框并检查操作类型。如果动作类型为“ 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;  
}  

用户回答回答于

可以使用onTouchEvent的。它防止在活动下对点击事件作出反应

@Override
public boolean onTouchEvent ( MotionEvent event ) {
  // I only care if the event is an UP action
  if ( event.getAction () == MotionEvent.ACTION_UP ) {
    // create a rect for storing the window rect
    Rect r = new Rect ( 0, 0, 0, 0 );
    // retrieve the windows rect
    this.getWindow ().getDecorView ().getHitRect ( r );
    // check if the event position is inside the window rect
    boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
    // if the event is not inside then we can close the activity
    if ( !intersects ) {
      // close the activity
      this.finish ();
      // notify that we consumed this event
      return true;
    }
  }
  // let the system handle the event
  return super.onTouchEvent ( event );
}

扫码关注云+社区