8.点击事件的分发机制

问题:

listview控件点击事件,添加了长按点击事件和点击事件,发现,长按点击事件执行之后点击事件也被触发了。

产生原因:

然后查看了一下Android的相关源码,可以看到系统是优先相应clicklisener的,他是没有返回值的的。而对于OnItemLongClickListener是有一个返回值标识。对于一次长按操作,如果返回false,则2个lisener都会相应,如果返回true则系统只处理长按事件。

这个需要从事件分发机制说起,在按钮响应事件的时候,如果同时绑定了长按和点击事件,长按事件触发时默认不做处理的话会优先响应长按事件,如果在长按事件里面你没有消费掉该事件,根据安卓的事件分发机制,该事件会继续向下传递,直到有控件把它消费掉为止。

明白了这个道理,长按事件和短按事件同时响应的问题就不难解决了,在同时绑定两个事件的情况下,如果先点击的是短按事件没问题,自然触发不到长按事件,但是如果先触发的是长按事件如果当前return false的话代表当前事件需要继续向下传递所以短按事件就被响应了,这种情况在onLongClick中返回true即可,代表当前有能力消费掉该事件,阻止事件向下传递,短按事件就不会被触发了。

解决办法:

OnItemLongClickListener长按事件生效且停止OnItemClickListener不生效,需要将返回值设为true。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 1. 概述   作为Android开发中最常见的一个控件,个人觉得有必要谈谈了。我们刚开始接触Android的时候...
    忆念成风阅读 3,217评论 2 16
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,548评论 1 11
  • 事件的分发和消费机制 一、简介: Activity或View类的onTouchEvent()回调函数会接收到tou...
    PaperKite阅读 1,548评论 0 3
  • 我读到的坚持全都来源于书中,来源于别人的故事里,好像除了每天坚持让自己活下去这件事情之外,没能坚持做任何一件事...
    安克丝阅读 249评论 0 0