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

Thử cách Compose
Jetpack Compose là bộ công cụ giao diện người dùng được đề xuất cho Android. Tìm hiểu cách xử lý các thao tác trên bàn phím trong Compose.

Khi người dùng đặt tiêu điểm vào một view văn bản có thể chỉnh sửa, chẳng hạn như một phần tử EditText và người dùng đã gắn bàn phím phần cứng, thì tất cả dữ liệu đầu vào sẽ do hệ thống xử lý. Tuy nhiên, nếu muốn tự chặn hoặc xử lý trực tiếp dữ liệu đầu vào từ bàn phím, bạn có thể làm như vậy 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ả 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 tiện ích của các lớp này, nếu thích 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 dự kiến rằng các sự kiện bàn phím chỉ đến từ bàn phím phần cứng. Đừng bao giờ dựa vào việc nhận các sự kiện chính cho bất kỳ phím nào trên phương thức nhập mềm (bàn phím ảo).

Xử lý các sự kiện liên quan đến một khoá

Để xử lý một thao tác nhấn phím riêng lẻ, hãy triển khai onKeyDown() hoặc onKeyUp(), tuỳ theo trường hợp. Thông thường, 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 một 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 phím bổ trợ, chẳng hạn như khi một phím được kết hợp với Shift hoặc Control, bạn có thể truy vấn KeyEvent được truyền đến phương thức gọi lại. 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 người dùng có đang nhấn chính xác phím bổ trợ mà bạn quan tâm hay không bằng các phương thức như isShiftPressed()isCtrlPressed().

Ví dụ: sau đây là quá trình triển khai onKeyUp() một lần nữa, với hoạt động xử lý bổ sung khi phím Shift được nhấn và giữ cùng với 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