Menangani tindakan keyboard

Saat pengguna memberikan fokus pada tampilan teks yang dapat diedit, seperti elemen EditText, dan pengguna memasang keyboard hardware, semua input akan ditangani oleh sistem. Namun, jika ingin mengintersep atau menangani sendiri input keyboard secara langsung, Anda dapat melakukannya dengan mengimplementasikan metode callback dari antarmuka KeyEvent.Callback, seperti onKeyDown() dan onKeyMultiple().

Baik class Activity maupun View mengimplementasikan antarmuka KeyEvent.Callback, sehingga Anda secara umum mengganti metode callback dalam ekstensi class ini sebagaimana mestinya.

Catatan: Saat menangani peristiwa keyboard dengan class KeyEvent dan API terkait, harapkan bahwa peristiwa keyboard hanya berasal dari keyboard hardware. Jangan pernah mengandalkan penerimaan peristiwa tombol apa pun untuk tombol apa pun pada metode input virtual (keyboard virtual).

Menangani peristiwa penting tunggal

Untuk menangani penekanan tombol individual, implementasikan onKeyDown() atau onKeyUp(), sebagaimana diperlukan. Biasanya, Anda menggunakan onKeyUp() jika ingin memastikan bahwa Anda hanya menerima satu peristiwa. Jika pengguna menekan dan menahan tombol, onKeyDown() akan dipanggil beberapa kali.

Misalnya, implementasi ini akan merespons beberapa tombol keyboard untuk mengontrol game:

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);
    }
}

Menangani kunci pengubah

Untuk merespons peristiwa tombol pengubah, seperti saat sebuah tombol dikombinasikan dengan Shift atau Control, Anda dapat mengueri KeyEvent yang diteruskan ke metode callback. Beberapa metode memberikan informasi tentang tombol pengubah, seperti getModifiers() dan getMetaState(). Namun, solusi yang paling sederhana adalah memeriksa apakah kunci pengubah yang Anda inginkan ditekan dengan metode seperti isShiftPressed() dan isCtrlPressed().

Misalnya, berikut adalah implementasi onKeyUp() lagi dengan penanganan tambahan saat tombol Shift ditekan dengan salah satu tombol:

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);
    }
}