关于给Dialog设置setCanceledOnTouchOutside(true)后如何监听Dialog消失
2017-05-28 19:45
609 查看
我们设置点击Dialog以外的区域时Dialog消失的设置如下:
首先看Dialog的 setCanceledOnTouchOutside(true)的方法里究竟是什么代码,点击进入Dialog的源码可以看到方法
以上代码中的mCancelable变量就是我们Dialog另外一个设置是否可消失的方法中设置的.
接着我们继续看关键代码mWindow.setCloseOnTouchOutside(cancel)
既然是点击事件,肯定离不开onTouchEvent()
上面的mCancelable是dialog.setCancelable设置的,关键我们来看mWindow.shouldCloseOnTouch(mContext, event)方法
根据名字我们都看出我们的关键方法是isOutOfBounds(context, event)
所以可以看出setCanceledOnTouchOutside(true)的监听其实是通过isOutOfBounds(context, event) 的,所以我们要监听点击其他区域关闭dialog的方法就要重写dialog的onTouchEvent方法,然后将isOutOfBounds中的代码加上,代码如下:
dialog.setCanceledOnTouchOutside(true);
首先看Dialog的 setCanceledOnTouchOutside(true)的方法里究竟是什么代码,点击进入Dialog的源码可以看到方法
public void setCanceledOnTouchOutside(boolean cancel) { if (cancel && !mCancelable) { mCancelable = true; } mWindow.setCloseOnTouchOutside(cancel); }
以上代码中的mCancelable变量就是我们Dialog另外一个设置是否可消失的方法中设置的.
dialog.setCancelable(true);
接着我们继续看关键代码mWindow.setCloseOnTouchOutside(cancel)
/** @hide */ public void setCloseOnTouchOutside(boolean close) { mCloseOnTouchOutside = close; mSetCloseOnTouchOutside = true; }
既然是点击事件,肯定离不开onTouchEvent()
public boolean onTouchEvent(MotionEvent event) { if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) { cancel(); return true; } return false; }
上面的mCancelable是dialog.setCancelable设置的,关键我们来看mWindow.shouldCloseOnTouch(mContext, event)方法
/** @hide */ public boolean shouldCloseOnTouch(Context context, MotionEvent event) { if (mCloseOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(context, event) && peekDecorView() != null) { return true; } return false; }
根据名字我们都看出我们的关键方法是isOutOfBounds(context, event)
private boolean isOutOfBounds(Context context, MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop(); final View decorView = getDecorView(); return (x < -slop) || (y < -slop) || (x > (decorView.getWidth()+slop)) || (y > (decorView.getHeight()+slop)); }
所以可以看出setCanceledOnTouchOutside(true)的监听其实是通过isOutOfBounds(context, event) 的,所以我们要监听点击其他区域关闭dialog的方法就要重写dialog的onTouchEvent方法,然后将isOutOfBounds中的代码加上,代码如下:
class myDialog extends Dialog{ //其他代码略······· //触摸对话框其他区域的监听 private void onTouchOutside(){} @Override public boolean onTouchEvent(MotionEvent event) { //触摸外部弹窗 if (isOutOfBounds(getContext(), event)) { onTouchOutside(); } return super.onTouchEvent(event); } private boolean isOutOfBounds(Context context, MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop(); final View decorView = getWindow().getDecorView(); return (x < -slop) || (y < -slop) || (x > (decorView.getWidth() + slop)) || (y > (decorView.getHeight() + slop)); } }
相关文章推荐
- ProgressDialog.setCanceledOnTouchOutside(false);
- ProgressDialog.setCanceledOnTouchOutside(false);
- ProgressDialog.setCanceledOnTouchOutside(false);
- dialog.setCancelable与setCanceledOnTouchOutside的区别
- dialog.setCancelable与setCanceledOnTouchOutside的区别
- setOnTouchEvent 设置返回值为true 和 false的区别
- [android] setOnTouchEvent 设置返回值为true 和 false的区别
- setOnTouchEvent 设置返回值为true 和 false的区别
- 安卓 listView的点击监听和滑动监听 setOnScrollListener setOnTouchListener
- 浅析Android的setOnTouchListener的返回值是false和true的区别
- Android 百度地图开发-setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
- convertView setOnTouchListener 监听不到 touch up,move等 事件
- 关于View的setOnTouchListener和setOnClickListener冲突
- 关于安卓alertdialog你能用到的都在这里了(进出动画,显示位置,背景,设置内容,是否可以点击其他地方消失,屏幕不变暗)
- Android 开发学习手记(三):关于PullToRefresh的setOnTouchListener()无效的问题。
- android listvieew PullToRefreshListView设置setOnTouchListener()失效
- 如何设置dialog下面的activity不变灰色。关于dialog的一些属性设置。
- 设置windowCloseOnTouchOutside让startActivityForResult接收传值的问题
- AlertDialog中使用自定义View,其中的Button如何设置点击事件监听
- Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义