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 Anda ingin memotong atau menangani input keyboard secara langsung, Anda dapat melakukannya dengan menerapkan metode callback dari antarmuka KeyEvent.Callback, seperti onKeyDown() dan onKeyMultiple().

Class Activity dan View mengimplementasikan antarmuka KeyEvent.Callback, sehingga Anda umumnya mengganti metode callback dalam ekstensi class ini, sebagaimana mestinya.

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

Menangani peristiwa penting tunggal

Untuk menangani penekanan tombol individual, implementasikan onKeyDown() atau onKeyUp(), sesuai kebutuhan. 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 ketika suatu tombol digabungkan dengan Shift atau Control, Anda dapat mengkueri 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 tombol pengubah yang penting bagi Anda sedang 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);
    }
}

Referensi lainnya