사용자가 EditText
요소와 같은 수정 가능한 텍스트 뷰에 포커스를 맞추는 경우 하드웨어 키보드가 연결되어 있으면 모든 입력이 시스템에서 처리됩니다. 하지만 앱에서 키보드 입력을 가로채거나 직접 처리하게 만들려면 KeyEvent.Callback
인터페이스에서 onKeyDown()
과 onKeyMultiple()
같은 콜백 메서드를 구현하면 됩니다.
Activity
클래스와 View
클래스 모두 KeyEvent.Callback
인터페이스를 구현하므로 일반적으로 이 클래스의 확장에서 적절하게 콜백 메서드를 재정의합니다.
참고: KeyEvent
클래스 및 관련 API를 사용하여 키보드 이벤트를 처리할 때는 키보드 이벤트가 하드웨어 키보드에서만 발생한다고 예상해야 합니다. 소프트 입력 방법 (터치 키보드)에서 발생하는 키 이벤트를 수신한다고 생각해서는 안 됩니다.
단일 키 이벤트 처리
개별 키 누르기를 처리하려면 적절하게 onKeyDown()
또는 onKeyUp()
를 구현합니다. 일반적으로 이벤트를 하나만 수신하려면 onKeyUp()
을 사용합니다. 사용자가 키를 길게 누르면 onKeyDown()
이 여러 번 호출됩니다.
예를 들어 다음 구현은 게임을 제어하는 일부 키보드 키에 응답합니다.
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) } }
자바
@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); } }
특수키 처리
키를 Shift 또는 Control 키와 함께 사용하는 작업처럼 특수키 이벤트에 응답하려면 콜백 메서드에 전달된 KeyEvent
를 쿼리하면 됩니다. getModifiers()
및 getMetaState()
와 같은 몇 가지 메서드를 통해 특수키와 관련된 정보를 얻을 수 있습니다.
하지만 가장 간단한 해결 방법은 isShiftPressed()
와 isCtrlPressed()
와 같은 메서드를 사용하여 중요한 특수키가 정확히 눌렸는지 확인하는 것입니다.
예를 들어 다음 onKeyUp()
구현에서는 Shift 키를 누른 채로 또 다른 키를 사용할 경우 이를 어떻게 추가적으로 처리할 수 있는지를 보여줍니다.
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); } }
추가 리소스
- Keyboard Shortcuts Helper: 사용자가 앱에서 제공하는 단축키를 검색할 수 있는 시스템 화면입니다.