2011年1月11日火曜日

[Android] PrintStream#printfの最適化(SDK r08でのエラーを別の方法で解決する)

How to solve the problem that "Multiple annotations found at this line" by a better method

[Android] SDKをバージョンアップしたらエラーだらけになったについて TwitterでJiroさんから別の解決方法を教えてもらいました。
http://twitter.com/#!/jiro_aqua/status/24100488370720769
Jiroさん、ありがとうございました。

変換指定文字についてjava.sun.comのリファレンスを調べたところ、書式文字列には引数リスト内での引数の位置を整数で示すように解説されています。

エラーが起きた書式です。
<string name="YourSelection">%s %s が選択されました</string>

この書式に引数の位置を加えます。
<string name="YourSelection">%1$s %2$s が選択されました</string>
これでエラーはなくなりました。

エラーメッセージの Multiple substitutions specified in non-positional format は「変換指定文字が複数あるのに引数の位置が指定されてない」ということでした。
変換指定文字が一つしかなければエラーにならないわけです。

引数の位置を指定するメリットはアプリケーションを多言語に対応させるときに発揮します。
日付の書式を日本語と日本語以外に対応させたサンプルを作ってみます。
サンプルの内容はActivityを起動すると日付をToastで表示するというものです。

日本語の年月日の書式を res/values-ja/string.xml に
<string name="date">%1$d年 %2$d月 %3$d日</string>
と設定します。

日本語以外の端末では日月年の順に表示するように res/values-eng/string.xml に
<string name="date">day:%3$d month:%2$d year:%1$d</string>
と設定します。

Activity(Main.java)のコードはこのようになります。


端末の設定が日本語の場合
端末の設定が日本語以外の場合

言語ごとの書式に引数の位置を指定しておけばJavaコードを変更することなく意図した内容を表示できるわけです。

以上、参考になれば幸いです。

変換指定文字を使っている Eye元気!/Vigorous eyes!お天気ロイド/Weatheroid(JP) どちらも公開中です!

0 件のコメント:

コメントを投稿