키보드 작업 처리

사용자가 수정 가능한 텍스트 뷰(예: 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)
    }
}

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

특수키 처리

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