입력 방식 생성
텍스트 필드나 다른 view에 텍스트를 입력하기 위한 입력 방식(IME)을 생성하기 위해 InputMethodService 클래스를 확장 할 수 있다. 이 클래스는 입력 방식의 상태와 가시성을 권리하는 관점과 현재 visible activity와의 통신 관점에서 입력 방식을 위한 기본 구현을 제공하다.
좋은 시작점은 SDK와 함께 제공되는 SoftKeyboard 샘플 코드를 분석하는 것이다. 자기 자신의 입력 방식을 만들기 위해 샘프 코드를 수정할수 있다.
입력 방식은 다른 어플리케이션이나 서비스처럼 패키지화되어 있다. AndroidManifest.xml파일 안에 적절한 intent filter와 관련 메타 데이터를 사용해 서비스로서 입력방식을 선언할 수 있다.
작성한 입력 방식이 사용자가 몇몇 설정을 수정할수 있도록 할 것이라면 activity가 설정 어플리케이션(Settings)으로부터 구동될수 있도록 설정해야 한다.이것은 선택사항이며 당신이 만든 IME의 UI를 모든 사용자가 직접 설정할수 있도록 할지의 선택이다.
InputMethodService의 전형적인 라이프 싸이클은 아래와 같다.
시각적 요소
입력 방식을 위한 2가지의 중요한 시각적 요소가 있는데 각각 입력 view와 후보 view 이다. 이 두가지중 하나가 만들고자 하는 입력 방식의 경험과 관련이 없다면 이 방식을 따르지 말아야 한다.
입력 view
필기체 인식, 제스츄어와 같은 키입력형태로 텍스트를 입력할수 있다. 처음 인력방식이 디스플레이 될때 InputMethodService.onCreateInputView() 가 호출된다. 입력 방식 윈도우에 디스플레이 하고자하는 뷰 계층 구조를 생성하고 리턴한다.
후보 view
사용자가 선택할수 있도록 단어 수정, 단어 완성과 같은 것에 해당되는 것으로 사용자 입력 방식과 관련 될수도 있고 안될수도 있다. 기본 동작을 정의하고 있는 InputMethodService.onCreatCandidatesView()의 호출의 리턴값을 null로 지정할수 있다.
다른 입력 유형을 위한 설계
어플리케이션의 텍스트 필드는 자유형식의 텍스트, 숫자, URL, 메일주소, 검색과 같은 다른 입력 유형을 가질수 있다. 따라서 새로운 입력 방식을 구현할때 다른 입력 유형을 식별할 필요가 있다. 입력 방식은 다른 입력 유형에 대해 자동으로 전환되지 않으므로 작성할 IME의 모든 유형을 지원할 필요가 있다. 하지만 IME는 어플리케이션에 전송될 입력값을 검사할 책임은 없다. 이 책임은 어플리케이션에서 수행해야한다.
예를 들어, 안드로이드 플랫폼에서 지원하는 라틴IME는 텍스트와 숫자값을 위한 다른 레이아웃을 제공한다.
InputMethodService.onStartInputView()는 어플리케이션 텍스트 필드의 다른 속성과 입력 유형에 대한 상세함을 포함하고 있는 EditorInfo 객체에 의해 호출된다.
EditorInfo.inputType 와 EditorInfo.TYPE_CLASS_MASK는 아래와 같은 많은 다른 값들중 하나가 될수 있다.
- TYPE_CLASS_NUMBER
- TYPE_CLASS_DATETIME
- TYPE_CLASS_PHONE
- TYPE_CLASS_TEXT
더 자세한 정보는 android.text.InputType을 참조.
EditorInfo.inputType은 다른 플래그와 변종(variation) 클래스를 나타내는 마스크 비트를 포함할 수 있다. 예를 들면 TYPE_TEXT_VRIATION_PASSWORD, TYPE_TEXT_VRIATION_URI, TYPE_TEXT_FLAG_AUTO_COMPLETE와 같은 것들.
패스워드 필드
패스워드 필드에 텍스트를 전송할때 특별한 주의가 필요하다. 패스워드는 UI내에서 보이지 않도록 해야하며 입력 view나 후보view에서도 마찬가지다. 또한 모든 곳에서 사용자에게 명시적으로 알리지 않고 패스워드를 저장면 않된다.
가로 대 세로
UI는 가로 방향안 새로 방향으로 스케일이 변경될 수 있다. 풀스크린이 아닌 IME모드에서 텍스트 필드와 관련 내용을 보여주기 위해 어플리케이션을 위한 충분한 공간이 확보되어야 한다. 가급적 IME은 화면의 반정도만 차지해야 하고 풀스크린 IME모드는 의미가 없다.
어플리케이션으로 텍스트 전송
어플리케이션으로 텍스트를 전송하는 2가지 방법이 있다. 각각의 키 이벤트를 전송하거나 어플리케이션의 텍스트 필드에 있는 커서 주변의 텍스트를 편집할 수 있다.
키 인벤트를 전송하기 위해 아래와 같이 단순히 KeyEvent 객체 생성자를 호추랗고 InputConnection.sendKeyEvent()를 호출할수 있다.
혹은 편리한 메소드를 사용할수도 있다.
![]() |
주의 각 각의 키가 눌러진 후에 텍스트를 적용하는 필터 때문에 전화번호 와 같은 필드에 대해서 위의 방법을 사용할 것을 권장한다. 리턴 키와 삭제 키는 어플리케이션이 액션을 수행하기 위해 특정 키 인벤트를 기다리고 있는 것과 같은 입력 유형에 대해서는 raw 키 이벤트로 전송될수 있다. |
아래와 같이, 텍스트 필드에서 텍스트를 편집할때 android.view.inputmethod.InputConnection보다 더 유용한 몇몇 메서드들이 있다.
- getTextBeforeCursor()
- getTextAfterCursor()
- deleteSurroundingText()
- commintText()
예를 들어 커서의 왼쪽에 "Fell" 텍스트를 "Hello!"로 대체하는 경우다.
커밋전에 텍스트 구성하기
개발한 입력 방식이 텍스트 입력을 예측하거나 단어나 문자를 구성하기 위해 여러단계가 필요할 경우 커밋전에 단어를 구성하는 과정을 보여줄 수 있고 부분적인 구성을 완성된 단어로 대체할수 있다. 구성중인 단어는 텍스트 필드에서 여러 형태(밑줄과 같은)로 하이라이트되어질수 있고
하드 키 이벤트 가로채기
입력 방식 윈도우가 명시적으로 포커스를 갖지 않더라도 원도우는 하드 키 이벤트를 우선적으로 받을 수 있고 그것들만 어플리케이션에 전달하거나 어떤 것을 사용할지 선택할 수 있다. 예를 들어, 개발자는 텍스트를 구성하는 동안 후보값들을 선택하기 위한 목적으로 사용자 UI내에서 네비게이션 하기 위해 직접적인 키 사용을 원할 수 있다. 혹은 입력방식 윈도우로부터 임의의 팝업을 무시하기 위해 back키를 사용할 수 있다. 하드키를 가로채기 위해 InputMethodService.onKeyDown()과 InputMethodService.onKeyUp()을 재정의하라. 개발자 스스로가 특정 키 소비를 원하지 않는다면 super.onKey() 를 반드시 호출하라.
다른 고려 사항
- 사용자가 입력 방식 UI로 부터 직접적으로 관련된 설정을 쉽게 할수 있는 방법을 제공하라.
- 사용자가 입력 방식 UI로 부터 직접적으로 다른 입력 방식으로 전환할 수 있는 방법을 제공하라 (다중 입력 방식이 설치되어있을수 있다.)
- 사용자가 텍스트 필드를 선택했을 경우 입력 방식을 빨리 볼수 있도록, 큰 리소스를 미리 로드 하던 나중에 로드하던 UI가 빨리 나타나게하라.
- flip(손가락을 툭 치는) 한 화면에 입력 방식이 사라지자 마자 어플리케이션이 충분한 메모리를 사용할수 있도록 즉시 큰 메모리 할당이 해지될수 있도록 해야한다. 입력 방식이 수초 동안 숨어 있는 상태라면 리소스를 해지하기 위해 지연 메시지 사용을 고려하라.
- 사용자가 패스워드가 사용자 이름에 마침표를 사용할수 있는 것처럼 대부분의 공통 문자는 입력 방식을 통해 입력 가능하며 패스워드 잠금 디바이스에 접근하기 위해 어떤 문자를 입력할수 없는 상황에서 멈추지 않아야 한다.
예제
다중 입력 유형과 텍스트 예측과 같은 실제 예를 보려면 LatinIME 소스코드 를 참조하라. 또한 안드로이드 SDK에서는 SoftKeyboard 예제를 제공한다.