1. 程式人生 > 其它 >Android:記一次View獲取按鍵事件

Android:記一次View獲取按鍵事件

技術標籤:Android:進階問題android

目的:希望view能夠獲取到按鍵事件

困難:給view設定了按鍵監聽器,但是onKey沒有執行。執行的是activity的onkeyDown()方法。

解決:

第一次嘗試思路:

從網上看到說是需要給view焦點,於是我用View.SetFocusable(true)使view獲得焦點,執行程式碼依然無效,view收不到按鍵事件

第二次嘗試思路:

繼續查資料,瞭解到

Android輸入事件的源頭是位於/dev/input/下的裝置節點,而輸入事件的終點是由WMS管理的某個視窗,最終由視窗中的View處理。最初的輸入事件為核心生成的原始事件,而最終交付給視窗的則是KeyEvent(鍵盤)或MotionEvent(滑鼠和觸控式螢幕)物件。輸入事件由Native層進入到Java層的第一個函式是InputEventReceiver.dispatchInputEvent(),這樣我們的手指觸控事件(MotionEvent)就傳遞到Java層,到應用層的傳遞過程遵循如下順序:Activity->Window->View;即View事件最先傳遞給Activity,然後由Activity傳遞給Window,最後由Window傳遞給View;頂級View(DecorView)接收到事件後,就會按照事件分發機制去分發事件;

作者:htkeepmoving
連結:https://www.jianshu.com/p/bb295eaf3154
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

事件先經過activity再傳到view,是不是activity分發的時候給攔截下來,沒有傳給view,於是我在dispatchKeyEvent方法中列印log,結果是false,表示activity並沒有消費掉事件,那是為啥麼沒有分發給view呢,思路陷入僵局。

第三次嘗試思路:

繼續在網上查閱資料,在一篇文章**《Android KeyEvent分發與焦點切換》**中談到了TouchMode的東西,通過調查TouchMode,我知道了,在觸控模式下,會讓view失去焦點,一下子讓我反應過來,會不會是view失去了焦點導致的問題。我通過log發現(view.isInTouchMode() 返回是否處於觸控模式),在onCreat()方法執行時,應用不是處於觸控模式,但是我按下按鍵之後,應用便變成觸控模式,這也就導致了view失去焦點從而無法收到按鍵事件,我接著又找到使view在觸控模式下獲得焦點的方法。

textView.setFocusableInTouchMode(true); //必須要設定在觸控模式下,否則無效
textView.requestFocus();

再執行程式碼,發現view可以正常接收按鍵事件了。

反思:

經過這次折騰,最後發現還是關鍵問題,view的焦點問題,按照原理,誰獲得焦點,誰就能收到按鍵事件,事實也是如此,view的方法執行了,activity的回撥方法並沒有執行。以後遇到問題還是得抓住重點!