Menangani tindakan keyboard

Saat pengguna memberikan fokus pada tampilan teks yang dapat diedit, seperti EditText pengguna, dan pengguna memasang {i> keyboard<i} perangkat keras, yang semuanya input ditangani oleh sistem. Namun, jika ingin mencegat atau menangani input keyboard secara langsung sendiri, Anda dapat melakukannya dengan menerapkan metode callback dari KeyEvent.Callback antarmuka, seperti onKeyDown() dan onKeyMultiple().

Baik Activity dan View class menerapkan KeyEvent.Callback, sehingga Anda umumnya akan mengganti metode callback di ekstensi Anda untuk class ini, seperti yang sesuai.

Catatan: Saat menangani peristiwa keyboard dengan KeyEvent dan API terkait, memperkirakan bahwa kejadian {i>keyboard<i} hanya berasal dari {i>keyboard<i} perangkat keras. Jangan pernah mengandalkan kunci penerima untuk tombol apa pun pada metode input virtual (keyboard virtual).

Menangani peristiwa penting tunggal

Untuk menangani penekanan tombol satu per satu, implementasikan onKeyDown() atau onKeyUp(), sebagaimana mestinya. Biasanya, Anda menggunakan onKeyUp() jika ingin memastikan bahwa Anda hanya menerima satu peristiwa. Jika pengguna menekan dan menahan tombol, maka onKeyDown() 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 tombol digabungkan dengan Shift atau Kontrol, Anda dapat buat kueri KeyEvent yang diteruskan ke metode callback. Beberapa metode menyediakan informasi tentang tombol pengubah, seperti getModifiers() dan getMetaState(). Namun, solusi yang paling sederhana adalah dengan memeriksa apakah tombol pengubah yang Anda inginkan sedang ditekan dengan metode seperti isShiftPressed() dan isCtrlPressed().

Misalnya, berikut adalah implementasi onKeyUp() sekali lagi, dengan penanganan ekstra 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