Cyril Mottierは、Androidソフトキーボード のsend/done/returnキーのカスタマイズに関するすばらしい投稿をしています。コードを試すとき、私(およびコメント)XMLで新しいID(@ + id/...など)を使用してimeActionIdを設定すると、一意のIDではなくユーザーがキーを押すとOnEditorActionListenerに0が返されることに気付きました。ただし、 ids.xmlでIDを指定し、imeActionIdをそれに設定します(例:w/@ id/...)。これにより、レイアウトインフレーションエラーが発生します。
ImeActionIdを一意のIDに設定するための唯一の方法は、Javaでプログラムで設定することでした。では、XML属性imeActionIdの正しい使用法は何ですか?
これが私のすべてのコードの要点です: https://Gist.github.com/gsysko/d46adbe27d409bde0299
この質問を検討していただきありがとうございます。
その理由は、この場合、imeActionId
はわずかな誤称であるためです。 imeActionId
のJavadocは次のように述べています。
入力メソッドがテキストビューに接続されているときに使用されるEditorInfo.actionIdの値を指定します。
値を割り当てるためにあなたを探しています。リソースIDは、アプリ内のリソースを識別するためのものであり、保証された値はありません。場合によっては、View.getId()
などのリソースIDに基づいて比較を行うことができますが、リソースIDをEditorInfo
が使用する定数値と混合することは適切ではありません。 Androidは、XMLファイルを解析するときに、見たように例外をスローすることでこれを阻止しようとする場合がありますが、プログラムで設定した場合、実行時に実行できるチェックは多くありません。
代わりに、次のようにリソースに整数値を定義できます。
<!--res/values/integers.xml-->
<resources>
<item type="integer" name="customImeActionId" format="integer">100</item>
</resources>
のように使用します
Android:imeActionId="@integer/customImeActionId"
コードでそれを取得できます
int imeActionId = getResources().getInteger(R.integer.customImeActionId);
編集:OK、これは私の興味をそそったので、Androidソースコードをさらに見ると、TextViewは次のように属性を解析します:
mEditor.mInputContentType.imeActionId = a.getInt(attr, mEditor.mInputContentType.imeActionId);
attr
のint値が見つからない場合は、デフォルト値(この場合は0)としてmEditor.mInputContentType.imeActionId
が使用されます。これは、新しく使用した場合に0を返す理由を説明しています。作成されたID。インフレエラーの原因はわかりません。