處理鍵盤動作

當使用者將焦點移至可編輯的文字檢視區塊 (例如 EditText 元素),且使用者已連接硬體鍵盤時,系統會處理所有輸入內容。不過,如果您想自行攔截或直接處理鍵盤輸入內容,可以透過實作 KeyEvent.Callback 介面 (例如 onKeyDown()onKeyMultiple()) 的回呼方法來執行這項操作。

ActivityView 類別都會實作 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);
    }
}

處理輔助鍵

如要回應輔助鍵事件 (例如當按鍵與 ShiftControl 鍵搭配使用時),您可以查詢傳遞至回呼方法的 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);
    }
}

其他資源