web-dev-qa-db-ja.com

事前定義されたIDリソースを使用してimeActionIdを設定すると、エラーが発生するのはなぜですか?

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

この質問を検討していただきありがとうございます。

16
gsysko

その理由は、この場合、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。インフレエラーの原因はわかりません。

31
trevor-e