Khi người dùng đặt tiêu điểm vào một thành phần 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 đã gắn bàn phím phần cứng, tất cả dữ liệu đầu vào sẽ do hệ thống xử lý. Tuy nhiên, nếu muốn chặn hoặc tự xử lý trực tiếp dữ liệu đầu vào từ bàn phím, bạn có thể thực hiện việc nà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()
và onKeyMultiple()
.
Cả lớp Activity
và View
đề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 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 có 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. 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ý 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()
, nếu phù hợp. Thông thường, bạn sử dụng hàm
onKeyUp()
nếu muốn đảm bảo rằng mình 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ý phím bổ trợ
Để phản hồi các sự kiện phím sửa đổi, 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ề phím bổ trợ, chẳng hạn như getModifiers()
và getMetaState()
.
Tuy nhiên, giải pháp đơn giản nhất là kiểm tra xem phương thức nào đang nhấn chính xác phím sửa đổi mà bạn quan tâm, chẳng hạn như isShiftPressed()
và isCtrlPressed()
.
Ví dụ: dưới đây là cách triển khai onKeyUp()
, 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
- Trình trợ giúp phím tắt : màn hình hệ thống cho phép người dùng tìm kiếm phím tắt mà ứng dụng của bạn cung cấp.