當使用者將焦點移至可編輯的文字檢視區塊 (例如 EditText
元素),而使用者已附加實體鍵盤時,系統會處理所有輸入。不過,如要自行攔截或直接處理鍵盤輸入內容,您可以從 KeyEvent.Callback
介面實作回呼方法 (例如 onKeyDown()
和 onKeyMultiple()
)。
Activity
和 View
類別都會實作 KeyEvent.Callback
介面,因此一般會視情況覆寫這些類別擴充功能中的回呼方法。
注意:使用 KeyEvent
類別和相關 API 處理鍵盤事件時,預期鍵盤事件只會來自實體鍵盤。請勿依賴任何按鍵事件 (螢幕小鍵盤) 接收任何按鍵的按鍵事件。
處理單一重要事件
如要處理個別按鍵動作,請視情況實作 onKeyDown()
或 onKeyUp()
。通常,如要確保您只會收到一項事件,則應使用 onKeyUp()
。如果使用者按住某個鍵,系統就會多次呼叫 onKeyDown()
。
舉例來說,此實作回應部分鍵盤按鍵以控制遊戲:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_D -> { moveShip(MOVE_LEFT) true } KeyEvent.KEYCODE_F -> { moveShip(MOVE_RIGHT) true } KeyEvent.KEYCODE_J -> { fireMachineGun() true } KeyEvent.KEYCODE_K -> { fireMissile() true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_D: moveShip(MOVE_LEFT); return true; case KeyEvent.KEYCODE_F: moveShip(MOVE_RIGHT); return true; case KeyEvent.KEYCODE_J: fireMachineGun(); return true; case KeyEvent.KEYCODE_K: fireMissile(); return true; default: return super.onKeyUp(keyCode, event); } }
處理輔助鍵
如要回應輔助鍵事件 (例如按鍵結合 Shift 或 Control),您可以查詢傳送至回呼方法的 KeyEvent
。有幾種方法可以提供輔助鍵的相關資訊,例如 getModifiers()
和 getMetaState()
。不過,最簡單的解決方式是檢查您重視的確切輔助鍵是否受到 isShiftPressed()
和 isCtrlPressed()
等方法的按下。
例如,以下再次執行 onKeyUp()
實作,其中含有在其中一個按鍵按住 Shift 鍵時的額外處理:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { ... KeyEvent.KEYCODE_J -> { if (event.isShiftPressed) { fireLaser() } else { fireMachineGun() } true } KeyEvent.KEYCODE_K -> { if (event.isShiftPressed) { fireSeekingMissle() } else { fireMissile() } true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { ... case KeyEvent.KEYCODE_J: if (event.isShiftPressed()) { fireLaser(); } else { fireMachineGun(); } return true; case KeyEvent.KEYCODE_K: if (event.isShiftPressed()) { fireSeekingMissle(); } else { fireMissile(); } return true; default: return super.onKeyUp(keyCode, event); } }