安卓对话框设置取消在触摸侧



我在ActivityGroup内部的Activty里有这个custom dialog

我希望对话框在外面单击时关闭,并尝试了我在网上找到的所有内容以使其正常工作。

我试过setCanceledOnTouchOutside(true) - 没有用

我试过:

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 );
    Log.i(r.toShortString(),r.toShortString());
    // 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.dismiss ();
      // notify that we consumed this event
      return true;
    }
  }

而且它也不起作用..

正如我在 LogCat 中看到的那样 - 我认为由于某种原因,对话框窗口大小是全屏的,这就是为什么我没有"外部"可以触摸......

我认为它可能必须与活动组做一些事情..任何建议?

好的,

经过大量思考,我找到了最简单的解决方案:

问题:

出于某种原因 - 尽管我使用的主题是对话框而不是全屏显示 - getWindow().getDecorView()返回覆盖整个屏幕的视图。

解决方案:

在我的 XML 文件中,我给了根元素一个 id,我更改了上面的函数,如下所示:

private View rootView;
public BaseDialog(Context context, int theme) {
    super(context, theme);  
    //I don't think the next 2 lines are really important - but I've added them for safety  
    setCancelable(true); 
    setCanceledOnTouchOutside(true);    
}
public void setRootView(int resourceId)
{
    this.rootView = findViewById(resourceId);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    Rect rect = new Rect();
    rootView.getHitRect(rect);
    if (!rect.contains((int)event.getX(), (int)event.getY()))
    {
        this.dismiss();
        return true;
    }
    return false;       
}       

希望它能帮助某人... :)

相关内容

  • 没有找到相关文章

最新更新