[解決済み] imeOptions, imeActionId, imeActionLabelの動作について
質問
私は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のバージョンであっても、一貫した動作を保証する方法はありません。あなたがしていることは、入力メソッドにヒントを提供することであり、入力メソッドはそれをどのようにユーザーに表示するかを選択するのです。
関連
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み] 現在のテーマでスタイル 'coordinatorLayoutStyle' を見つけることができませんでした。
-
[解決済み】カメラサービスへの接続に失敗しました。
-
[解決済み】android.content.ActivityNotFoundException: 明示的なアクティビティクラスを見つけることができません。
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] Android SDK の場所には空白を含めないでください。NDK ツールで問題が発生するためです。
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
-
[解決済み] TextViewでテキストを水平・垂直方向にセンタリングするには?
-
[解決済み] match_parentとfill_parentの違いは何ですか?
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AndroidのSSL接続でトラストアンカーが見つからない
-
[解決済み】Androidエミュレータのエラーメッセージ。"PANIC: Missing emulator engine program for 'x86' CPUS." (パニック: エミュレータ・エンジン・プログラムがありません)
-
[解決済み] 現在のテーマでスタイル 'coordinatorLayoutStyle' を見つけることができませんでした。
-
[解決済み】Android Studioでマニフェストのマージに失敗し、複数のエラーが発生した。
-
[解決済み】リストビューにonclicklistenerを追加する(android)
-
[解決済み】Bluestackの向きを変更する : ポートレート/ランドスケープモード
-
[解決済み】Android Studioで最新バージョンのgradleを使用する方法
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] SDKの場所がandroid studioで見つからない
-
[解決済み] setBackgroundDrawable() 非推奨