インプット メソッドを作成する

インプット メソッド エディタ(IME)は、ユーザーがテキストを入力するためのユーザー コントロールです。Android は、 アプリがユーザーに代替の入力方法を提供できるようにする、拡張可能なインプット メソッド フレームワーク たとえば画面キーボードや音声入力などですIME をインストールした後、ユーザーは以下から IME を 1 つ選択できます。 その設定をシステム全体で使用できます一度に有効にできる IME は 1 つのみです。

Android システムに IME を追加するには、 拡張 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 の動作を変更する場合、「設定」の定義はコンテナから起動できる システム設定。

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.inputmethodservice および android.view.inputmethod 提供します。KeyEvent クラスは次のとおりです。 キーボードの文字を処理するうえで重要な役割を果たします。

IME の中心部分は、サービス コンポーネントであり、 InputMethodService。この API は、通常のサービス ライフサイクルの実装に加えて、 クラスには、IME の UI の提供、ユーザー入力の処理、テキスト メッセージへのテキスト配信を行うコールバックがあります。 フィールドがあります。デフォルトでは、InputMethodService クラスは、 IME の状態と可視性を管理し、現在の IME と通信するための実装を 表示されます。

次のクラスも重要です。

BaseInputConnection
メッセージからコミュニケーション チャネルを InputMethod 戻されます。このクラスを使用すると、カーソルの周囲のテキストを読み取り、テキスト ボックスにテキストをコミットし、未加工のキーイベントをアプリに送信できます。アプリケーションは、ベース インターフェースを実装するのではなく、このクラスを拡張する必要があります。 InputConnection
KeyboardView
次の View の拡張。 キーボードをレンダリングし、ユーザー入力イベントに応答します。キーボード レイアウトは インスタンス Keyboard, これは XML ファイルで定義できます。

インプット メソッド UI を設計する

IME には、入力ビューと candidates ビューです。実装する必要があるのは、 入力方法を指定します。

入力ビュー

入力ビューは、ユーザーがキークリック、手書き、入力などの形式でテキストを入力する UI です。 行います。IME が初めて表示されたとき、システムは onCreateInputView() 呼び出すことができます。このメソッドの実装で、IME に表示するレイアウトを作成します。 レイアウトをシステムに返します。次のスニペットは、HashiCorp Configuration Language onCreateInputView() メソッドを使用します。

Kotlin

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

Java

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

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

    return inputView;
}

この例の MyKeyboardView は、次のカスタム実装のインスタンスです。 Keyboard をレンダリングする KeyboardView

候補ビュー

候補ビューは、候補となる単語の修正や候補を IME が表示する UI です 選択します。IME のライフサイクルでは、システムにより onCreateCandidatesView() 候補ビューを表示する準備が整うとこのメソッドの実装で、 単語の候補を表示するか、何も表示しない場合は null を返すレイアウト。null 応答がデフォルトの動作であるため、API レスポンスを 提案します。

UI 設計に関する考慮事項

このセクションでは、IME の UI 設計に関する考慮事項について説明します。

さまざまな画面サイズを処理する

IME の UI は、さまざまな画面サイズに合わせて拡大縮小でき、横向きの両方を処理できる必要があります。 画面の向きを変えることができます非全画面 IME モードでは、アプリが テキスト フィールドとそれに関連するコンテキストを表示し、スペースが画面の半分を超えないようにする 確認できます。全画面 IME モードでは問題ありません。

さまざまな入力タイプを処理する

Android のテキスト フィールドでは、特定の入力タイプ(自由形式のテキスト、数字、URL、 メールアドレス、検索文字列などです。新しい IME を実装する際は、各 IME の入力タイプを検出します。 適切なインターフェースを指定します。ただし、IME を ユーザーが入力タイプに有効なテキストを入力しているかどうかを確認します。この責任は テキスト フィールドを所有するアプリケーション

Latin IME が Android プラットフォームのテキスト用に提供しているインターフェースの例を以下に示します。 input:

Latin IME でのテキスト入力を示す画像
図 2. ラテン文字 IME のテキスト入力。

これは、Latin IME が Android プラットフォーム向けに提供するインターフェースです。 数値入力:

Latin IME での数値入力を示す画像
図 3. ラテン文字 IME の数値入力。

入力フィールドがフォーカスを受け取って IME を起動すると、システムは onStartInputView(), 渡すには EditorInfo オブジェクト には、テキスト フィールドの入力タイプとその他の属性に関する詳細情報が含まれます。このオブジェクトでは、 inputType フィールドにはテキスト フィールドの入力タイプが含まれます。

inputType フィールドは、さまざまなビットパターンを含む int です。 設定します。テキスト フィールドの入力タイプをテストするには、これを定数でマスクします。 TYPE_MASK_CLASS, 例:

Kotlin

inputType and InputType.TYPE_MASK_CLASS

Java

inputType & InputType.TYPE_MASK_CLASS

入力型のビットパターンには、次のいずれかの値を指定できます。

TYPE_CLASS_NUMBER
数値を入力するためのテキスト フィールド。図 3 に示すように、Latin IME の欄には テンキーです。
TYPE_CLASS_DATETIME
日時を入力するためのテキスト フィールド。
TYPE_CLASS_PHONE
電話番号を入力するためのテキスト フィールド。
TYPE_CLASS_TEXT
サポートされている文字を入力するためのテキスト フィールド。

これらの定数について詳しくは、 InputType

inputType フィールドには、テキスト フィールドのバリエーションを示す他のビットを含めることができます。 タイプを指定します。

TYPE_TEXT_VARIATION_PASSWORD
パスワードを入力するための TYPE_CLASS_TEXT のバリアント。入力方法は、 実際のテキストの代わりにディンバットを表現します。
TYPE_TEXT_VARIATION_URI
TYPE_CLASS_TEXT のバリアント。ウェブ URL やその他の Uniform Resource を入力するために使用します。 識別子(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 をテキスト フィールドに commit し、新しいカーソル位置を設定します。

たとえば、次のスニペットは、文字列の左にある 4 つの文字を置き換える方法を示しています。 カーソルを「Hello!」と表示します:

Kotlin

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

Java

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

commit 前のテキスト作成をサポート

IME がテキストを予測する場合や、グリフや単語を作成するために複数の手順が必要な場合は、 ユーザーがその単語を確定するまでテキスト フィールドが進行し、 完成されたテキストで構成されます。テキストに特別な処理を加えるには、 span を使用します。 setComposingText()

次のスニペットは、テキスト フィールドに進行状況を表示する方法を示しています。

Kotlin

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

Java

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

ハードウェア キーイベントをインターセプトする

インプット メソッド ウィンドウに明示的なフォーカスがない場合でも、ハードウェア キーイベントを受け取ります。 取得して使用したり、アプリケーションに転送したりできます。たとえば 方向キーを使用して UI 内を移動し、作成中に候補を選択する また、戻るキーをトラップして、インプット メソッドから発信されたダイアログを閉じることもできます。 クリックします。

ハードウェア キーをインターセプトするには、 onKeyDown() および onKeyUp()

自身で処理しないキーに対して super() メソッドを呼び出します。

IME サブタイプを作成する

サブタイプを使用すると、IME がサポートしている複数の入力モードと言語を公開できます。サブタイプは 以下を表します。

  • 言語 / 地域(en_US、fr_FR など)
  • 入力モード(音声、キーボード、手書きなど)
  • IME に固有のその他の入力スタイル、フォーム、プロパティ(テンキー、QWERTY など) キーボード レイアウト

モードには「keyboard」などの任意のテキストを指定できます指定します。サブタイプでは、特定のイベントや あります

サブタイプ情報は、通知バーから利用できる IME 切り替えダイアログに使用されます 確認できますこの情報により、フレームワークで IME の特定のサブタイプを表示することもできます。 直接渡されます。IME を作成する際は、サブタイプ機能を使用します。これにより、ユーザーはサブタイプ機能を識別して IME の言語とモードの切り替え。

インプット メソッドの XML リソース ファイルのいずれかでサブタイプを定義します。 <subtype> 要素。次のコード スニペットでは、2 つのサブタイプを持つ IME を定義しています。 US English の言語 / 地域用の Keyboard サブタイプと、フランス語用の Keyboard サブタイプがあります。 フランスの言語 / 地域:

<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` を使用して、 サブタイプの言語 / 地域ラベルと同じです。次の 2 つのコード スニペットで、これを示しています。「 最初のスニペットは、インプット メソッドの 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>

この設定により、サブタイプの表示名がロケール設定と一致します。たとえば、 英語の言語 / 地域では、表示名は「English (United States)」になります。

通知バーから 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 の IP アドレスかを識別できます。true を指定した場合、 現在の IME。

IME に関する一般的な考慮事項

IME を実装する際は、以下の点も考慮してください。

  • ユーザーが IME の UI から直接オプションを設定できるようにしました。
  • ユーザーがインプット メソッド UI から直接別の IME に切り替える方法を提供する。 これは、デバイスに複数の IME がインストールされている可能性があるためです。
  • IME の UI をすばやく表示します。大規模なリソースをプリロードまたはオンデマンドで読み込んで、ユーザーが テキスト フィールドをタップするとすぐに IME が表示されます。後続のリソースとビューをキャッシュに保存する インプット メソッドの呼び出し。
  • インプット メソッド ウィンドウが非表示になった直後に大きなメモリ割り当てを解放し、 十分なメモリがあることを 確認する必要があります遅延メッセージを使用してリソースを解放する IME が数秒間非表示になります。
  • ユーザーが該当する言語または地域でできるだけ多くの文字を入力できるようにしてください 表示されます。ユーザーがパスワードやユーザー名に句読点を使用する可能性があるため、IME は ユーザーがパスワードを入力したり、 ダウンロードします