1. ホーム
  2. アンドロイド

[解決済み] imeOptions, imeActionId, imeActionLabelの動作について

2022-03-03 06:32:16

質問

私はAndroidのネイティブ開発にかなり慣れていないのですが、IMEのアクションボタンをカスタマイズする方法について考えています。Googleのドキュメントを見ましたが、期待される動作についての情報はほとんど見当たりません。

からの 公式ガイド キーボードアクションボタンは、属性を用いて設定することができると理解しています。

  • アンドロイド:タイムオプション は、スペースキーの近くに表示されるボタンのテキスト/id をあらかじめ定義された値に設定できます (例: actionGo は、キーラベルを 行く で、idは2)
  • android:imeActionLabel キーボードがフルスクリーンのとき、通常はランドスケープモードで、入力エリア内に表示されるボタンのラベルを設定します。任意の文字列値を設定することができます。
  • android:imeActionId 前述と同じですが、コールバックメソッドに渡されるIDを数値で設定します。

しかし、経験的に試したところ、APIレベル15と次のAPIレベルでは動作が異なることがわかりました。

単純なEditText要素に以下の属性を設定しました。

<EditText
        ...
        android:imeOptions="actionGo"
        android:imeActionLabel="Custom"
        android:imeActionId="666"
        android:inputType="text"/>

で、縦長と横長の両方でAPIレベルを変えて効果を確認しました。以下はその結果です。

APIレベル15 - 4.0.3

ポートレートモードでは、キーラベルは 行く で、コールバックメソッドに渡されるアクションIDは、imeOptionsの設定にしたがって、2です。

ランドスケープモードでは、キーラベル/キーIDは 行く /2、入力エリアに表示されるボタンは カスタム imeActionLabelとimeActionIdの属性に従って、/666になります。

APIレベル16、17、18 - 4.1.2、4.2.2、4.3

縦長でも横長でも、キーとボタンは カスタム ラベルは666のidにバインドされ、imeOptions属性は無視されます。

この挙動の不一致は、かなり厄介です。

  • API level >= 16では、キーボタンと入力エリアボタンの区別がつきません。
  • APIレベル=15では、キーボタンにカスタムテキストを設定することができません。

API15と16+の両方で取得する方法をご存知でしょうか? あるいは、すべての(あるいは少なくとも一部の)APIバージョンで一貫した動作を得る方法があれば教えてください。

もしかしたら、IMEの設定で、異なる動作を正当化できる何かを見逃しているのかもしれません...。

ありがとうございました。

解決方法は?

設定した値をどうするかは、実はAndroidフレームワーク自体ではなく、入力メソッドアプリが決めているのです。

Androidフレームワークは、設定した値を入力メソッドに渡すだけで、入力メソッドは、キーボードや"抽出された"に表示するボタンを選択することができます。 EditText を全画面表示で表示します。Androidフレームワークは EditorInfo の2つの方法で行います。

  • を通過させるのです。 EditorInfo.makeCompatible の値が互換性を持つように、キーボードの targetApiVersion s. 今のところ、これは一部の InputType の値はエディタアクションではなく、新しいエディタアクション(または完全に新しい設定)が導入された場合、変更される可能性があります。

  • を設定するものです。 デフォルト の動作は、フルスクリーンエディタに関する動作も含めて、入力メソッドに適用されます。入力メソッドがこのデフォルトの振る舞いを上書きしないことを選択した場合、Androidのバージョンごとに異なる振る舞いになってしまう可能性があります。多くのキーボードは、Androidのバージョン間で一貫性のある独自の動作を設定することを選択しています。

そのため、ある特定の EditorInfo フィールドは、どのバージョンでも一定の効果を発揮します。また、1つのAndroidのバージョンであっても、一貫した動作を保証する方法はありません。あなたがしていることは、入力メソッドにヒントを提供することであり、入力メソッドはそれをどのようにユーザーに表示するかを選択するのです。