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

Khi người dùng tập trung vào một khung hiển thị văn bản có thể chỉnh sửa, chẳng hạn như EditText và người dùng có bàn phím phần cứng đi kèm, tất cả đầu vào do hệ thống xử lý. Tuy nhiên, nếu bạn muốn chặn hoặc trực tiếp tự xử lý việ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ừ KeyEvent.Callback giao diện, chẳng hạn như onKeyDown()onKeyMultiple().

Cả Activity và lớp View sẽ triển khai KeyEvent.Callback, vì vậy, bạn thường sẽ ghi đè phương thức gọi lại trong phần mở rộng của các lớp này, như phù hợp.

Lưu ý: Khi xử lý các sự kiện bàn phím bằng KeyEvent và các API liên quan, 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. Không bao giờ dựa vào nhận khoá các sự kiện 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 chính đơn lẻ

Để xử lý từng thao tác nhấn phím, hãy triển khai onKeyDown() hoặc onKeyUp(), khi phù 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() được gọi nhiều lần.

Ví dụ: phương thức 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ý phím bổ trợ

Để phản hồi các sự kiện phím của 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 vào phương thức gọi lại. Một số phương pháp 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 phím bổ trợ chính xác mà bạn quan tâm đang được nhấn bằng các phương thức như isShiftPressed()isCtrlPressed().

Ví dụ: dưới đây là cách triển khai onKeyUp() một lần nữa, với cách xử lý bổ sung khi nhấn và 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