当前位置: 首页 > news >正文

android设置点击事件外部类,Android中Dialog设置外部点击事件

一、点击外部取消显示

一般来说,在android中用到的都是设置dialog点击外部取消dialog的显示,这个直接设置setCanceledOnTouchOutside方法即可。

public void setCanceledOnTouchOutside(booleancancel) {if (cancel && !mCancelable) {

mCancelable= true;

}

//下面是调用window对象设置

mWindow.setCloseOnTouchOutside(cancel);

}

点击外部,最终还是会进入onTouchEvent事件的,

public booleanonTouchEvent(MotionEvent event) {//mWindow.shouldCloseOnTouch(mContext, event)返回值就是上面的设置值,true会进入//cancel方法。

if (mCancelable && mShowing &&mWindow.shouldCloseOnTouch(mContext, event)) {

cancel();return true;

}return false;

}

cancel方法会调用dismissDialog方法,然后通过windowmanager移除dialog的顶层decor视图(view)就可以了,源码还是很简单的,想看的可以自己跟一下。

二、点击外部自己监听事件

但是有时候我们不仅仅是需要设置点击外部取消,而是想做一些其他的动作,比如点击外部跳转到其他Activity等,在网上找到一种思路。首先在View创建之前设置两个Flag,一个设置窗口为非模式的,这样除窗口外的内容就可以获得touch事件,然后设置窗口外部touch事件发生时的通知。最后重写onTouchEvent,监听窗口外的Touch事件。这样就可以在监听方法中自定义窗口外点击事件的响应,是否关闭窗口或者其他操作。

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//Make us non-modal, so that others can receive touch events.

getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);//...but notify us that it happened.

getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);//Note that flag changes must happen *before* the content view is set.

setContentView(R.layout.my_dialog_view);

}

@Overridepublic booleanonTouchEvent(MotionEvent event) {//If we've received a touch notification that the user has touched//outside the app, finish the activity.

if (MotionEvent.ACTION_OUTSIDE ==event.getAction()) {

finish();return true;

}//Delegate everything else to Activity.

return super.onTouchEvent(event);

}

这种方式需要dialog下面的Activity没有点击事件,不过这种可能性很小,因此点击的时候事件会传递到dialog下面的Activity的view,因此实用性不强。

三、监听点击位置设置事件

这种方式我用着是最好的,实用性比较强,就是根据点击的位置判断是不是在dialog的外部。

@Overridepublic booleanonTouchEvent(MotionEvent event) {if (event.getAction() ==MotionEvent.ACTION_DOWN) {if (!(event.getX() >= -10 && event.getY() >= -10)|| event.getX() >= calendarLayout.getWidth() + 10

|| event.getY() >= calendarLayout.getHeight() + 20) {//如果点击位置在当前View外部则销毁当前视图,其中10与20为微调距离

finish();

}

}return true;

}

相关文章:

  • html零基础自学,第一个HTML页面如何写?——零基础自学网页制作
  • CentOS+Nginx+PHP+Mysql+安全指南全环境搭建笔记
  • html怎么转换docx,html2word html转换为word 使用docx4j
  • html5网页中加入播放器,6 个 HTML5 的多媒体播放器
  • 在CentOs 5.1中使用rpm安装NGINX+php+mysql
  • android go更新机型,诺基亚1 Plus喜提Android 10 GO系统更新
  • HTML聊天框特效,利用jQuery实现响应式聊天窗口界面特效
  • 鼠标闲置一段时间后自动隐藏
  • html购物倒计时,基于javascript实现的购物商城商品倒计时实例
  • LWUIT + ChartComponent 之一实现饼图(PieChart)
  • win10n网页如何保存为html,win10浏览器如何保存网页_win10浏览器怎么保存网页
  • 牛人(笑来)VS牛人(阿朱):惺惺相惜 - [读书,这么好的事儿]
  • 2021年湖南高考音体美成绩查询方式,2021年湖南高考成绩什么时候出来 公布时间...
  • itmo大学计算机专业,【俄罗斯圣光机大学访学】计算机学院ITMO交流访学团
  • LWUIT + ChartComponent 之二实现线形图(LineChart)
  • @angular/forms 源码解析之双向绑定
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 10个确保微服务与容器安全的最佳实践
  • Android组件 - 收藏集 - 掘金
  • ComponentOne 2017 V2版本正式发布
  • fetch 从初识到应用
  • javascript数组去重/查找/插入/删除
  • yii2权限控制rbac之rule详细讲解
  • 初识 webpack
  • 服务器从安装到部署全过程(二)
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 理清楚Vue的结构
  • 排序算法学习笔记
  • 判断客户端类型,Android,iOS,PC
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 通过几道题目学习二叉搜索树
  • 微信小程序:实现悬浮返回和分享按钮
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #162 (Div. 2)
  • #Linux(权限管理)
  • #传输# #传输数据判断#
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (九十四)函数和二维数组
  • (十六)一篇文章学会Java的常用API
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • . Flume面试题
  • .apk 成为历史!
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃