입력 방법 만들기

입력 방식 편집기 (IME)는 사용자가 텍스트를 입력할 수 있는 사용자 컨트롤입니다. Android는 확장 가능한 입력 방법 프레임워크로, 애플리케이션이 사용자에게 대체 입력 방법을 제공할 수 있도록 합니다. 터치 키보드나 음성 입력 등의 기능을 사용할 수 있습니다 IME를 설치한 후 사용자는 IME를 선택할 수 있습니다. 시스템 설정을 변경하고 전체 시스템에서 사용합니다. 한 번에 하나의 IME만 사용 설정할 수 있습니다.

IME를 Android 시스템에 추가하려면 확장 InputMethodService 또한 일반적으로 '설정'을 만들어 활동을 IME 서비스에 전달합니다. 나 시스템 설정의 일부로 표시되는 설정 UI도 정의할 수 있습니다.

이 페이지에서 다루는 주제는 다음과 같습니다.

IME를 사용해 본 적이 없다면 소개 도움말을 읽어 보세요. 화면상의 입력 방법 있습니다.

<ph type="x-smartling-placeholder">

IME 수명 주기

다음 다이어그램은 IME의 수명 주기를 설명합니다.

IME의 수명 주기를 보여주는 이미지입니다.
그림 1. IME의 수명 주기

다음 섹션에서는 IME와 연결된 UI 및 코드를 구현하는 방법을 설명합니다. 이 수명 주기를 따릅니다

매니페스트에서 IME 구성요소 선언

Android 시스템에서 IME는 특수 IME 서비스가 포함된 Android 애플리케이션입니다. 이 애플리케이션의 매니페스트 파일은 서비스를 선언하고 필요한 권한을 요청하고 action.view.InputMethod 작업과 일치하는 인텐트 필터와 메타데이터를 제공하는 인텐트 필터 IME의 특성을 정의합니다. 또한, 사용자가 광고를 게재할 수 있도록 하는 설정 인터페이스를 '설정'을 정의할 수 있습니다 포드에서 실행할 수 있는 시스템 설정으로 이동합니다.

다음 스니펫은 IME 서비스를 선언합니다. 권한을 요청합니다. BIND_INPUT_METHOD 서비스가 IME를 시스템에 연결하도록 하려면 작업과 일치하는 인텐트 필터를 설정 android.view.InputMethod로, IME의 메타데이터를 정의합니다.

<!-- Declares the input method service. -->
<service android:name="FastInputIME"
    android:label="@string/fast_input_label"
    android:permission="android.permission.BIND_INPUT_METHOD">
    <intent-filter>
        <action android:name="android.view.InputMethod" />
    </intent-filter>
    <meta-data android:name="android.view.im"
               android:resource="@xml/method" />
</service>

다음 스니펫은 IME의 설정 활동을 선언합니다. 여기에는 ACTION_MAIN 는 이 활동이 IME 애플리케이션의 기본 진입점임을 나타냅니다.

<!-- Optional: an activity for controlling the IME settings. -->
<activity android:name="FastInputIMESettings"
    android:label="@string/fast_input_settings">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
    </intent-filter>
</activity>

UI에서 직접 IME 설정에 액세스하는 권한을 제공할 수도 있습니다.

입력 방법 API

IME 관련 클래스는 android.inputmethodserviceandroid.view.inputmethod 패키지입니다 KeyEvent 클래스는 중요한 역할을 합니다.

IME의 핵심은 API를 확장하는 클래스인 서비스 구성요소입니다. InputMethodService 일반 서비스 수명 주기를 구현하는 것 외에도 클래스에는 IME UI를 제공하고 사용자 입력을 처리하고 필드를 확인할 수 있습니다. 기본적으로 InputMethodService 클래스는 IME의 상태와 가시성을 관리하고 현재 입력합니다.

다음 클래스도 중요합니다.

BaseInputConnection
통신 채널을 정의합니다. InputMethod 돌아가야 할 수 있습니다 커서 주위의 텍스트를 읽고 텍스트 상자에 텍스트를 커밋하며 원시 키 이벤트를 애플리케이션에 전송하는 데 사용합니다. 애플리케이션은 기본 인터페이스를 구현하는 대신 이 클래스를 확장해야 합니다. InputConnection
KeyboardView
View의 확장 키보드를 렌더링하고 사용자 입력 이벤트에 응답합니다. 키보드 레이아웃은 인스턴스 Keyboard, XML 파일에서 정의할 수 있습니다

입력 방법 UI 디자인

IME에는 두 가지 기본 시각적 요소인 입력 뷰와 candidates 보기입니다. 다음과 관련된 요소만 구현하면 됩니다. 여러 가지 방법이 있습니다.

입력 뷰

입력 뷰는 사용자가 키 클릭, 필기 입력 또는 동작입니다. IME가 처음 표시될 때 시스템은 onCreateInputView() 있습니다. 이 메서드를 구현할 때 IME에 표시하려는 레이아웃을 만듭니다. 레이아웃을 시스템에 반환합니다. 다음 스니펫은 onCreateInputView() 메서드:

Kotlin

override fun onCreateInputView(): View {
    return layoutInflater.inflate(R.layout.input, null).apply {
        if (this is MyKeyboardView) {
            setOnKeyboardActionListener(this@MyInputMethod)
            keyboard = latinKeyboard
        }
    }
}

자바

@Override
public View onCreateInputView() {
    MyKeyboardView inputView =
        (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null);

    inputView.setOnKeyboardActionListener(this);
    inputView.setKeyboard(latinKeyboard);

    return inputView;
}

이 예에서 MyKeyboardViewKeyboard를 렌더링하는 KeyboardView.

후보군 뷰

후보군 뷰는 IME가 잠재적 단어 수정이나 제안을 표시하는 UI입니다. 사용자가 선택할 수 있습니다. IME 수명 주기에서 시스템은 onCreateCandidatesView() 후보 뷰를 표시할 준비가 되면 이 메서드의 구현에서 추천 단어를 표시하는 레이아웃을 사용하거나, 아무것도 표시하지 않으려면 null을 반환합니다. null 응답이 기본 동작이므로 응답을 제공하지 않는 경우 있습니다.

UI 디자인 고려사항

이 섹션에서는 IME의 UI 디자인 고려사항 몇 가지를 설명합니다.

여러 화면 크기 처리

IME의 UI는 다양한 화면 크기에 맞게 조정되고 두 가로 모드를 모두 처리할 수 있어야 합니다. 사용할 수 있습니다. 전체 화면이 아닌 IME 모드에서는 애플리케이션이 텍스트 필드와 관련 컨텍스트가 표시되므로 IME입니다. 전체 화면 IME 모드에서는 문제가 되지 않습니다.

다양한 입력 유형 처리

Android 텍스트 필드를 사용하면 자유 형식 텍스트, 숫자, URL, 이메일 주소, 검색 문자열 등이 있습니다 새 IME를 구현할 때 각 IME의 입력 유형을 감지합니다. 필드에 사용하고 적절한 인터페이스를 제공합니다. 하지만 사용하기 위해 IME를 설정할 필요는 없습니다. 사용자가 입력 유형에 유효한 텍스트를 입력했는지 확인합니다. 이것은 애플리케이션을 빌드합니다.

예를 들어 다음은 라틴어 IME가 Android 플랫폼 텍스트에 제공하는 인터페이스입니다. 입력:

라틴어 IME의 텍스트 입력을 보여주는 이미지
그림 2. 라틴어 IME 텍스트 입력

다음은 라틴 IME가 Android 플랫폼에 제공하는 인터페이스입니다. 숫자 입력:

라틴어 IME의 숫자 입력을 보여주는 이미지
그림 3. 라틴어 IME 숫자 입력

입력란이 포커스를 수신하고 IME가 시작되면 시스템은 onStartInputView(), 인코더-디코더 아키텍처를 객체 EditorInfo개 - 텍스트 필드의 입력 유형 및 기타 속성에 관한 세부정보가 포함된 를 확인하세요. 이 객체에서 inputType 필드에는 텍스트 필드의 입력 유형이 포함됩니다.

inputType 필드는 다양한의 비트 패턴이 포함된 int입니다. 입력 유형 설정입니다. 텍스트 필드의 입력 유형에 관해 테스트하려면 상수로 마스킹하세요. TYPE_MASK_CLASS, :

Kotlin

inputType and InputType.TYPE_MASK_CLASS

자바

inputType & InputType.TYPE_MASK_CLASS

입력 유형 비트 패턴은 다음을 포함한 여러 값 중 하나를 가질 수 있습니다.

TYPE_CLASS_NUMBER
숫자를 입력하는 텍스트 필드입니다. 그림 3과 같이 라틴어 IME는 숫자 패드를 사용합니다.
TYPE_CLASS_DATETIME
날짜와 시간을 입력하는 텍스트 필드입니다.
TYPE_CLASS_PHONE
전화번호를 입력하는 텍스트 필드입니다.
TYPE_CLASS_TEXT
지원되는 문자를 입력하는 텍스트 필드입니다.

이러한 상수는 InputType

inputType 필드에는 텍스트 필드의 변형을 나타내는 다른 비트가 포함될 수 있습니다. 다음과 같은 유형이 있습니다.

TYPE_TEXT_VARIATION_PASSWORD
비밀번호를 입력하는 TYPE_CLASS_TEXT의 변형입니다. 입력 방법은 딩뱃으로 바꾸기만 하면 됩니다.
TYPE_TEXT_VARIATION_URI
웹 URL 및 기타 Uniform Resource를 입력하는 TYPE_CLASS_TEXT의 변형입니다. 식별자 (URI).
TYPE_TEXT_FLAG_AUTO_COMPLETE
애플리케이션에 사용되는 텍스트를 입력하는 TYPE_CLASS_TEXT의 변형입니다. 사전, 검색 또는 기타 시설에서 자동 완성 기능을 사용합니다.

이러한 변형을 테스트할 때 적절한 상수로 inputType를 마스킹합니다. 이 사용 가능한 마스크 상수는 InputType 참조 문서에 나열되어 있습니다.

<ph type="x-smartling-placeholder">

애플리케이션에 텍스트 전송

사용자가 IME로 텍스트를 입력하면 개발자가 개별 메시지를 애플리케이션의 텍스트 필드에서 커서 주위의 텍스트를 수정하면 됩니다. 두 경우 모두 InputConnection 인스턴스를 사용하여 텍스트를 전달합니다. 이 인스턴스를 가져오려면 다음을 호출합니다. InputMethodService.getCurrentInputConnection()

커서 주위 텍스트 수정

기존 텍스트 편집을 처리할 때 BaseInputConnection는 다음과 같습니다.

getTextBeforeCursor()
CharSequence 반환 - 현재 커서 위치 앞에 요청된 문자 수를 포함합니다.
getTextAfterCursor()
다음의 요청된 문자 수를 포함하는 CharSequence를 반환합니다. 반환합니다.
deleteSurroundingText()
현재 커서 위치 앞뒤에 지정된 수의 문자를 삭제합니다.
commitText()
CharSequence를 텍스트 필드에 커밋하고 새 커서 위치를 설정합니다.

예를 들어 다음 스니펫은 커서를 사용합니다.

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.deleteSurroundingText(4, 0)
    ic.commitText("Hello", 1)
    ic.commitText("!", 1)
}

자바

InputConnection ic = getCurrentInputConnection();
ic.deleteSurroundingText(4, 0);
ic.commitText("Hello", 1);
ic.commitText("!", 1);

커밋하기 전에 텍스트 작성 지원

IME가 텍스트를 예측하거나 글리프 또는 단어를 작성하는 데 여러 단계를 필요로 하는 경우 단어의 나머지 부분을 완성된 텍스트로 완성됩니다. 텍스트에 특수 문자를 추가하려면 span을 이 객체의 setComposingText()입니다.

다음 스니펫은 텍스트 필드에 진행률을 표시하는 방법을 보여줍니다.

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.setComposingText("Composi", 1)
    ic.setComposingText("Composin", 1)
    ic.commitText("Composing ", 1)
}

자바

InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);

하드웨어 키 이벤트 가로채기

입력 방법 창에 명시적 포커스가 없어도 하드웨어 키 이벤트를 수신합니다. 소비하거나 애플리케이션에 전달할 수 있습니다. 예를 들어 작성 중에 방향 키를 사용하여 UI 내에서 후보 선택을 위해 탐색합니다. 뒤로 키를 트랩하여 입력 방법에서 시작된 대화상자를 닫을 수도 있습니다. 창

하드웨어 키를 가로채려면 onKeyDown()onKeyUp()입니다.

직접 처리하고 싶지 않은 키의 super() 메서드를 호출합니다.

IME 하위유형 만들기

하위유형을 사용하면 IME가 IME에서 지원하는 여러 입력 모드와 언어를 노출할 수 있습니다. 하위유형은 다음을 나타냅니다.

  • 언어(예: en_US 또는 fr_FR)
  • 입력 모드(예: 음성, 키보드, 필기 입력)
  • 10키 또는 QWERTY와 같은 IME와 관련된 기타 입력 스타일, 양식, 속성 키보드 레이아웃

모드는 모든 텍스트(예: 'keyboard')일 수 있습니다. '음성'으로 정의합니다. 하위유형은 확인할 수 있습니다

하위유형 정보는 알림바에서 사용할 수 있는 IME 전환 대화상자에 사용됩니다. IME 설정을 확인하세요. 이 정보를 통해 프레임워크에서 IME의 특정 하위유형을 불러올 수도 있습니다. 바로 그것입니다. IME를 빌드할 때 하위유형 기능을 사용하세요. 사용자가 하위유형 기능을 식별하고 서로 다른 IME 언어 및 모드 간에 전환할 수 있습니다.

입력 방법의 XML 리소스 파일 중 하나에서 <subtype> 요소 다음 코드 스니펫은 두 가지 하위유형이 있는 IME를 정의합니다. 미국 영어의 키보드 하위유형과 프랑스어의 다른 키보드 하위유형 사용 지역:

<input-method xmlns:android="http://schemas.android.com/apk/res/android"
        android:settingsActivity="com.example.softkeyboard.Settings"
        android:icon="@drawable/ime_icon">
    <subtype android:name="@string/display_name_english_keyboard_ime"
            android:icon="@drawable/subtype_icon_english_keyboard_ime"
            android:languageTag="en-US"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="somePrivateOption=true" />
    <subtype android:name="@string/display_name_french_keyboard_ime"
            android:icon="@drawable/subtype_icon_french_keyboard_ime"
            android:languageTag="fr-FR"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" />
    <subtype android:name="@string/display_name_german_keyboard_ime" ... />
</input-method>

하위유형의 라벨이 UI에서 올바르게 지정되도록 하려면 `%s` 를 사용하여 하위유형의 언어 라벨과 동일합니다. 다음 두 코드 스니펫에 나와 있습니다. 이 첫 번째 스니펫은 입력 방법 XML 파일의 일부를 표시합니다.

<subtype
    android:label="@string/label_subtype_generic"
    android:imeSubtypeLocale="en_US"
    android:icon="@drawable/icon_en_us"
    android:imeSubtypeMode="keyboard" />

다음 스니펫은 IME의 strings.xml 파일의 일부입니다. 문자열 리소스 label_subtype_generic: 입력 방법 UI 정의에서 하위유형의 라벨은 다음과 같이 정의됩니다.

<string name="label_subtype_generic">%s</string>

이 설정으로 하위유형의 표시 이름이 언어 설정과 일치하게 됩니다. 예를 들어 영어의 경우 표시 이름은 '영어 (미국)'입니다.

알림바에서 IME 하위유형 선택

Android 시스템은 모든 IME에서 노출한 하위유형을 모두 관리합니다. IME 하위유형은 IME를 사용할 수 있습니다. 사용자는 알림바나 설정 앱에서 사용 가능한 IME 하위유형 메뉴로 구성된 메뉴를 제공합니다.

언어 및 시스템 메뉴 입력
그림 4. 언어 및 입력 시스템 메뉴로 이동합니다.

시스템 설정에서 IME 하위유형 선택

사용자는 또한 언어 및 입력 설정 패널 다음과 같이 설정합니다.

언어 선택 메뉴를 보여주는 이미지
그림 5. 언어 시스템 메뉴

IME 하위유형 간 전환

다음과 같은 전환 키를 제공하여 사용자가 IME 하위유형 간에 쉽게 전환하도록 할 수 있습니다. 지구본 모양의 언어 아이콘을 탭합니다. 이렇게 하면 키보드의 사용성이 개선되고 편리함 입니다. 이 전환을 사용 설정하려면 다음 단계를 따르세요.

  1. 입력 방법의 XML 리소스 파일에서 supportsSwitchingToNextInputMethod = "true"를 선언합니다. 선언은 다음 코드 스니펫과 비슷해야 합니다.
    <input-method xmlns:android="http://schemas.android.com/apk/res/android"
            android:settingsActivity="com.example.softkeyboard.Settings"
            android:icon="@drawable/ime_icon"
            android:supportsSwitchingToNextInputMethod="true">
    
  2. 먼저 shouldOfferSwitchingToNextInputMethod() 메서드를 사용하여 축소하도록 요청합니다.
  3. 메서드가 true를 반환하면 전환 키를 표시합니다.
  4. 사용자가 전환 키를 탭하면 switchToNextInputMethod(), false를 전달합니다. false 값은 어떤 IME에 속하는지 알 수 있습니다. true를 지정하면 시스템이 현재 IME.

일반적인 IME 고려사항

다음은 IME를 구현할 때 고려해야 할 다른 사항입니다.

  • 사용자가 IME UI에서 직접 옵션을 설정하는 방법을 제공합니다.
  • 사용자가 입력 방법 UI에서 직접 다른 IME로 전환할 수 있는 방법을 제공합니다. 여러 IME가 기기에 설치될 수 있기 때문입니다.
  • IME UI를 빠르게 불러옵니다. 크기가 큰 리소스는 사용자가 요청할 때 미리 로드하거나 텍스트 필드를 탭하자마자 IME를 볼 수 있습니다. 입력 방법의 후속 호출을 위한 리소스와 뷰를 캐시합니다.
  • 입력 방법 창이 숨겨진 직후에 대용량 메모리 할당을 해제합니다. 충분한 메모리가 있어야 합니다 지연된 메시지를 사용하여 리소스 해제하기 IME가 몇 초 동안 숨겨져 있는 경우.
  • 사용자가 언어에 최대한 많은 문자를 입력할 수 있도록 합니다. IME와 연결되어 있습니다. 사용자가 비밀번호나 사용자 이름에 구두점을 사용할 수 있으므로 IME는 은(는) 다양한 문자를 제공하여 사용자가 비밀번호를 입력하고 있습니다.