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. Akan tetapi, jika Anda ingin memotong sendiri atau menangani 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 harus mengganti metode callback pada ekstensi tersebut jika 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 masukan virtual (keyboard virtual).

Menangani peristiwa penting tunggal

Untuk menangani penekanan tombol individual, implementasikan onKeyDown() atau onKeyUp() jika 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, 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 kunci pengubah seperti saat suatu tombol digabungkan dengan Shift atau Control, Anda dapat membuat kueri KeyEvent yang diteruskan ke metode callback. Beberapa metode menyediakan informasi tentang kunci pengubah seperti getModifiers() dan getMetaState(). Akan tetapi solusi yang paling sederhana adalah memeriksa apakah kunci pengubah yang Anda inginkan ditekan dengan metode seperti isShiftPressed() dan isCtrlPressed().

Misalnya, berikut adalah implementasi onKeyDown(), dengan beberapa 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);
        }
    }