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

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

IME を Android システムに追加するには、InputMethodService を拡張するクラスを含む Android アプリを作成します。また、通常は、オプションを 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 サービスを宣言するスニペットを以下に示します。このスニペットは、サービスが IME をシステムに接続できるようにする BIND_INPUT_METHOD 権限をリクエストして、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 には、入力ビューと 候補ビューという 2 つの主要な視覚要素があります。実装する必要があるのは、設計する入力方法に関係する要素だけです。

入力ビュー

入力ビューは、キークリック、手書き、ジェスチャーなどを介してユーザーがテキストを入力する 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 レスポンスであるため、候補を提示しない場合、このメソッドを実装する必要はありません。

UI 設計に関する考慮事項

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

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

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

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

Android のテキスト フィールドでは、特定の入力タイプ(自由形式のテキスト、数字、URL、 メールアドレス、検索文字列などです。新しい IME を実装する場合は、各フィールドの入力タイプを検出して、その入力タイプに適したインターフェースを提供します。ただし、ユーザーが入力タイプに対して有効なテキストを入力したかどうかをチェックするように IME をセットアップする必要はありません。この責任は テキスト フィールドを所有するアプリケーション

たとえば、Android プラットフォームのテキスト入力用に Latin IME が提供するインターフェースは次のとおりです。

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

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

Latin IME での数値入力を示す画像
図 3. Latin 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);

コミット前にテキストを構成する機能をサポート

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」、「voice」など)を使用できます。サブタイプでは、特定のエンティティを あります

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

サブタイプを定義する際は、インプット メソッドのいずれかの XML リソース ファイルで <subtype> 要素を使用します。次のコード スニペットは、2 つのサブタイプ(US English 言語 / 地域のキーボード サブタイプと、フランスの French 言語 / 地域のキーボード サブタイプ)を持つ 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` を使用して、 サブタイプの言語 / 地域ラベルと同じです。次の 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 に属するかも確認できます。true が指定された場合は、現在の IME 内でサブタイプを循環させる必要があります。

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

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

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