2017-05-11 16 views
2

下面是什麼文件說,大約Activity.onKeyUp()安卓的onkeyup()事件被觸發,即使重點是一個EditText

當一個鍵被釋放,內部沒有任何的意見 處理調用活動。因此,例如,鍵盤按下時,TextView中的光標 不會觸發事件(除非它是導航到另一個對象的 ),因爲TextView處理其自己的鍵 按鍵。

但是,如果我重寫一個活動的onKeyUp(),並檢查是否當我輸入一個鍵時,焦點是在EditText它被炒魷魚,我可以看到onKeyUp()在下列情況下被解僱(上AVD測試)。

  • 如果通過硬件鍵盤按下某個鍵。
  • 如果從虛擬鍵盤輸入數字鍵(事件不會爲字符鍵觸發)。

如果我正確理解了文檔,onKeyUp()不應該在上述情況下被解僱。

那麼,是文件錯誤,還是我誤解了?

是否有任何其他方式可以捕獲鍵盤事件不由任何其他UI元素處理?

回答

0

這似乎是一個錯誤,因爲如果EditText有焦點,onKeyDown不會被調用。但是,這確實意味着我們可以添加黑客來判斷我們是否應對onKeyUp事件做出反應。以下是我處理它的方式:

private val filteredEvents = HashMap<Long, KeyEvent>() 

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { 
    filteredEvents.remove(event.downTime)?.let { 
     Log.d("TAG", "Filtered event occurred. Handle it here.") 
    } 
    return super.onKeyUp(keyCode, event) 
} 

override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean = 
     super.onKeyDown(keyCode, event.also { filteredEvents[it.downTime] = it })