前幾天遇到一個小問題,就是給listview添加onItemClickListener、onItemLongClickListener、onTouchEvent三種事件的 時候,只執行了onTouchEvent事件,而其他的兩個事件未執行,解決辦法:在對應的onTouchEvent的action裏面設置return false;當執行到該action的時候就會返回false,前兩個事件就會執行了。解決方法很簡單,爲此還特意研究了一下View對事件響應的流程。
Android的各個View之間的關係是一顆樹,下面的子View都是在父View的基礎上建立的,可以看成子View疊加在父類的View上。下面我們來看一下兩種不同情況的事件處理。
1、給同一個View設置了OnTouchEvent事件、OnClickListener事件與OnLongClickListener事件,當點擊View的時候,事件的響應順序是:
Touch事件的ACTION_DOWN -> ACTION_UP -> OnClick/OnLongClick。
該View是怎麼響應這個點擊動作的呢?
首先,該View會先響應ACTION_DOWN事件,並返回一個boolean值,這裏有兩種判斷:
a:返回True,表示該View接受此按下動作,就是說這個點擊動作的按下操作被中止,然後就是響應ACTION_UP事件。點擊動作的按下操作被ACTION_DOWN接受之後就結束了,所以之後的OnClick/OnLongClick事件就不會響應了。
b:返回false,表示該View不接受此按下動作,響應完之後,按下操作繼續往下發,之後是響應ACTION_UP事件,這裏又有一個判斷:
如果ACTION_UP事件返回True,表示ACTION_UP接受鬆開操作,鬆開操作中止;View會一直處於按下狀態,之後View便會響應OnLongClick事件。
如果ACTION_UP事件返回false,表示ACTION_UP不接收鬆開操作,鬆開操作繼續下發;因爲按下與鬆開操作都沒有被中止,所以之後View就會響應OnClick事件。
2、多個View之間的事件響應:
如果有多層View,一個layout佈局,在此佈局上放一個TextView,並將TextView的寬高設置爲fill_parent(確保點擊的是在TextVIew上)。給Activity與TextView都設置OnTouchListener事件。事件響應的順序是先從頂層的View開始的。所以,當點擊屏幕時(TextView所在區域的屏幕)。
TextView響應ACTION_DOWN,返回false,ACTION_DOWN繼續下發,Activity響應ACTION_DOWN事件。如果返回true,表示ACTION_DOWN到TextView就被中止了,而不會繼續往下被Activity捕獲了。
ACTION_UP的響應方式有點不同,響應ACTION_UP的有兩種條件,必須滿足其一:
a、最下面一層(此處是Activity)。
b、其對應的ACTION_DOWN是終止點,即其ACTION_DOWN的返回值爲true;