8.點(diǎn)擊事件的分發(fā)機(jī)制

問題:

listview控件點(diǎn)擊事件,添加了長按點(diǎn)擊事件和點(diǎn)擊事件,發(fā)現(xiàn),長按點(diǎn)擊事件執(zhí)行之后點(diǎn)擊事件也被觸發(fā)了。

產(chǎn)生原因:

然后查看了一下Android的相關(guān)源碼,可以看到系統(tǒng)是優(yōu)先相應(yīng)clicklisener的,他是沒有返回值的的。而對于OnItemLongClickListener是有一個返回值標(biāo)識。對于一次長按操作,如果返回false,則2個lisener都會相應(yīng),如果返回true則系統(tǒng)只處理長按事件。

這個需要從事件分發(fā)機(jī)制說起,在按鈕響應(yīng)事件的時候,如果同時綁定了長按和點(diǎn)擊事件,長按事件觸發(fā)時默認(rèn)不做處理的話會優(yōu)先響應(yīng)長按事件,如果在長按事件里面你沒有消費(fèi)掉該事件,根據(jù)安卓的事件分發(fā)機(jī)制,該事件會繼續(xù)向下傳遞,直到有控件把它消費(fèi)掉為止。

明白了這個道理,長按事件和短按事件同時響應(yīng)的問題就不難解決了,在同時綁定兩個事件的情況下,如果先點(diǎn)擊的是短按事件沒問題,自然觸發(fā)不到長按事件,但是如果先觸發(fā)的是長按事件如果當(dāng)前return false的話代表當(dāng)前事件需要繼續(xù)向下傳遞所以短按事件就被響應(yīng)了,這種情況在onLongClick中返回true即可,代表當(dāng)前有能力消費(fèi)掉該事件,阻止事件向下傳遞,短按事件就不會被觸發(fā)了。

解決辦法:

OnItemLongClickListener長按事件生效且停止OnItemClickListener不生效,需要將返回值設(shè)為true。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 1. 概述 ??作為Android開發(fā)中最常見的一個控件,個人覺得有必要談?wù)劻?。我們剛開始接觸Android的時候...
    憶念成風(fēng)閱讀 3,345評論 2 16
  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,696評論 1 11
  • 事件的分發(fā)和消費(fèi)機(jī)制 一、簡介: Activity或View類的onTouchEvent()回調(diào)函數(shù)會接收到tou...
    PaperKite閱讀 1,590評論 0 3
  • 我讀到的堅(jiān)持全都來源于書中,來源于別人的故事里,好像除了每天堅(jiān)持讓自己活下去這件事情之外,沒能堅(jiān)持做任何一件事...
    安克絲閱讀 297評論 0 0

友情鏈接更多精彩內(nèi)容