Android/개발 정보

안드로이드 한/영 전환 관련 키 이벤트

일놀 2024. 10. 22. 14:16
728x90
반응형

안드로이드 개발하면서 앱에서 한/영 전환을 해야하는 경우 발생. (Android Language Switch button)

이는 블루투스 키보드(하드웨어 키보드)를 연결하여 한/영 키를 눌러서 앱 안에서 한글 및 영어로 전환이 되게 하려함.

 

문제는 한/영키 누르면 안드로이드 로컬 언어도 변경이 됨.

1. (로컬 언어) 영어 / (앱 언어) 영어   -> 정상 입력

2. (로컬 언어) 한글 / (앱 언어) 영어   -> 정상 입력

3. (로컬 언어) 영어 / (앱 언어) 한글   -> 정상 입력

4. (로컬 언어) 한글 / (앱 언어) 한글   -> 비정상 입력

즉, 로컬 언어가 한글일 경우 앱 언어가 한글이면 정상적으로 입력되지 않음. (한글이 입력되는데 단어가 완성되기 전까지 안보이다가 다음 동작이 들어오면 그때서야 이전에 입력했던 글자가 나옴)

 

추적결과 키입력시 로컬 언어가 영어일 경우 dispatchKeyEventPreIme - onKeyDown - 한/영전환 라이브러리 - onKeyUp - 라이브러리  순으로 진행되는데 로컬 언어가 한글일 경우 dispatchKeyEventPreIme 만 타는 것을 확인.

( 한/영 전환과 관련하여 라이브러리로 keycode 등을 보내고 있는 프로젝트 )

 

* dispatchKeyEventPreIme 이란?

뷰 계층과 연관된 입력 방법에 의해 처리되기 전에 키 이벤트를 전송. 이것은 IME가 소비하기 전에 특수 상황에서 키 이벤트를 가로채는 데 사용할 수 있음. 일반적인 예로는 IME가 보고 스스로 닫는 대신 BACK 키를 처리하여 애플리케이션의 UI를 업데이트하는 것. 이벤트가 처리됐으면 true 아니면 false를 반환하고 기본적으로 false를 반환

https://developer.android.com/reference/android/view/View#dispatchKeyEventPreIme(android.view.KeyEvent)

 

문제를 해결하기 위해 dispatchKeyEventPreIme 메소드에서 처리.

// SessionView라는 View 클래스에서 선언되어 있는 상태에서 SessionActivity에 선언된 onKeyDown메소드로 보내는 코드


@Override public boolean dispatchKeyEventPreIme(KeyEvent event)
    {
    	// 마우스로 뒤로가기 버튼 클릭시
       if (event.getKeyCode() == KeyEvent.KEYCODE_BACK &&
             event.getAction() == KeyEvent.ACTION_DOWN){

          if(event.getSource() != InputDevice.SOURCE_MOUSE)
             ((SessionActivity) this.getContext()).onBackPressed();
       }

	// 한/영 전환 키 또는 오른쪽 Alt 키 눌렀을 때 true 호출
       if (event.getKeyCode() == KeyEvent.KEYCODE_ALT_RIGHT || event.getKeyCode() == KeyEvent.KEYCODE_LANGUAGE_SWITCH) {
          // 한/영 전환 라이브러리 타는 부분 (onKeyDown 메소드에 선언되어 있는 상태)
          ((SessionActivity) this.getContext()).onKeyDown(event.getKeyCode(), event);
          return true;
       }
       
       // 기본적으로 super.dispatchKeyEventPreIme(event)는 false를 반환
       return super.dispatchKeyEventPreIme(event);
    }

 

이렇게 하니까 안드로이드 로컬 언어의 한/영은 바뀌지 않고 앱 언어만 바뀌는 것을 확인.

 

728x90
반응형