8.点击事件的分发机制

问题:

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

产生原因:

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

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

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

解决办法:

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

你可能感兴趣的:(8.点击事件的分发机制)