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 sendiri 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 menerapkan antarmuka KeyEvent.Callback, jadi secara umum Anda perlu mengganti metode callback dalam ekstensi class ini sebagaimana diperlukan.

Catatan: Saat menangani peristiwa keyboard dengan class KeyEvent dan API terkait, Anda akan mengetahui bahwa peristiwa keyboard tersebut hanya berasal dari keyboard hardware. Anda sebaiknya tidak perlu bergantung pada penerimaan peristiwa penting untuk tombol apa pun pada metode input lunak (keyboard di layar).

Menangani peristiwa penting tunggal

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

Misalnya, penerapan 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 kunci pengubah seperti ketika suatu kunci dikombinasikan dengan Shift atau Control, Anda dapat meminta KeyEvent yang diteruskan ke metode callback. Beberapa metode akan memberikan informasi tentang kunci pengubah seperti getModifiers() dan getMetaState(). Namun, solusi paling sederhana adalah memeriksa apakah kunci pengubah yang Anda inginkan ditekan dengan metode seperti isShiftPressed() dan isCtrlPressed().

Contoh, berikut adalah penerapan onKeyDown(), dengan beberapa penanganan tambahan saat tombol Shift ditekan dengan salah satu kunci:

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