編輯:Android開發教程
其實我一直准備寫一篇關於Android事件分發機制的文章,從我的第一篇博客開始,就零零散散在好多地 方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼 區別,又該如何使用?為什麼給ListView引入了一個滑動菜單的功能,ListView就不能滾動了?為什麼圖片 輪播器裡的圖片使用Button而不用ImageView?等等……對於這些問題,我並沒有給出非常詳細的回答,因為 我知道如果想要徹底搞明白這些問題,掌握Android事件分發機制是必不可少的,而Android事件分發機制絕 對不是三言兩語就能說得清的。
在我經過較長時間的籌備之後,終於決定開始寫這樣一篇文章了。目 前雖然網上相關的文章也不少,但我覺得沒有哪篇寫得特別詳細的(也許我還沒有找到),多數文章只是講了 講理論,然後配合demo運行了一下結果。而我准備帶著大家從源碼的角度進行分析,相信大家可以更加深刻 地理解Android事件分發機制。
閱讀源碼講究由淺入深,循序漸進,因此我們也從簡單的開始,本篇 先帶大家探究View的事件分發,下篇再去探究難度更高的ViewGroup的事件分發。
那我們現在就開始 吧!比如說你當前有一個非常簡單的項目,只有一個Activity,並且Activity中只有一個按鈕。你可能已經 知道,如果想要給這個按鈕注冊一個點擊事件,只需要調用:
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "onClick execute"); } });
這樣在onClick方法裡面寫實現,就可以在按鈕被點擊的時候執行。你可能也已經知道,如果想 給這個按鈕再添加一個touch事件,只需要調用:
button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "onTouch execute, action " + event.getAction()); return false; } });
onTouch方法裡能做的事情比onClick要多一些,比如判斷手指按下、抬起、移動等事件。那麼 如果我兩個事件都注冊了,哪一個會先執行呢?我們來試一下就知道了,運行程序點擊按鈕,打印結果如下 :
可以看到,onTouch是優先於 onClick執行的,並且onTouch執行了兩次,一次是ACTION_DOWN,一次是ACTION_UP(你還可能會有多次 ACTION_MOVE的執行,如果你手抖了一下)。因此事件傳遞的順序是先經過onTouch,再傳遞到onClick。
細心的朋友應該可以注意到,onTouch方法是有返回值的,這裡我們返回的是false,如果我們嘗試把 onTouch方法裡的返回值改成true,再運行一次,結果如下:
我們發現,onClick方法不再執行了!為什麼會這樣呢?你可以先理解成onTouch方法返回true就認為這個 事件被onTouch消費掉了,因而不會再繼續向下傳遞。
如果到現在為止,以上的所有知識點你都是清 楚的,那麼說明你對Android事件傳遞的基本用法應該是掌握了。不過別滿足於現狀,讓我們從源碼的角度分 析一下,出現上述現象的原理是什麼。
微軟已經對Android平台上的Outlook應用進行了升級,除了修復消費者反饋的大量BUG之外還對收件箱的功能進行了強化,為消費者提供未讀和已標記信息的篩選功能,此外還
本文中如果直接安裝時不出現錯誤,則可以忽略(一、二、三、四、五),我安裝的是5.1.1,直接成功,就是有點慢,要有耐心。如果到最後一步,啟動不起來,報錯:emulator
其實實現ListView過濾功能最方便的便是使用ArrayAdapter,裡面自帶的 getFilter()方法能很方便的實現此功能,但是在實際的開發中,一般都是繼承於
如果願意的話,可以把Activity的標題欄給隱藏了。只需要調用requestWindowFeature()方法,同時傳遞 Window.FEATURE_NO_TITLE