Xử lý thao tác trên bàn phím

Khi người dùng đặt tiêu điểm cho một khung hiển thị văn bản có thể chỉnh sửa (chẳng hạn như phần tử EditText) và người dùng có đính kèm bàn phím phần cứng, thì hệ thống sẽ xử lý mọi hoạt động đầu vào. Tuy nhiên, nếu muốn chặn hoặc trực tiếp tự xử lý phương thức nhập bằng bàn phím, bạn có thể thực hiện bằng cách triển khai các phương thức gọi lại từ giao diện KeyEvent.Callback, chẳng hạn như onKeyDown()onKeyMultiple().

Cả hai lớp ActivityView đều triển khai giao diện KeyEvent.Callback, vì vậy, bạn thường ghi đè các phương thức gọi lại trong phần mở rộng của các lớp này, nếu phù hợp.

Lưu ý: Khi xử lý các sự kiện bàn phím bằng lớp KeyEvent và các API liên quan, hãy kỳ vọng rằng các sự kiện bàn phím chỉ đến từ bàn phím phần cứng. Tuyệt đối không dựa vào việc nhận các sự kiện chính cho bất kỳ phím nào trong phương thức nhập mềm (bàn phím ảo).

Xử lý một sự kiện chính

Để xử lý một thao tác nhấn phím riêng lẻ, hãy triển khai onKeyDown() hoặc onKeyUp() (nếu phù hợp). Thường thì bạn sử dụng onKeyUp() nếu muốn đảm bảo rằng bạn chỉ nhận được một sự kiện. Nếu người dùng nhấn và giữ một phím, thì onKeyDown() sẽ được gọi nhiều lần.

Ví dụ: cách triển khai này phản hồi một số phím trên bàn phím để điều khiển trò chơi:

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

Xử lý các phím bổ trợ

Để phản hồi các sự kiện liên quan đến phím bổ trợ, chẳng hạn như khi một phím được kết hợp với phím Shift hoặc Control, bạn có thể truy vấn KeyEvent được truyền đến phương thức gọi lại. Có một số phương thức cung cấp thông tin về các phím bổ trợ, chẳng hạn như getModifiers()getMetaState(). Tuy nhiên, giải pháp đơn giản nhất là kiểm tra xem liệu phím bổ trợ chính xác mà bạn quan tâm có được nhấn bằng các phương thức như isShiftPressed()isCtrlPressed() hay không.

Ví dụ: dưới đây là cách triển khai onKeyUp(), với cách xử lý bổ sung khi nhấn giữ phím Shift bằng một trong các phím:

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

Tài nguyên khác