Android 文字列リソースの扱いと取得方法
「strings.xml」に書かれた文字列を取得する方法のメモ。
文字列と文字列配列のみ記載。
ドキュメントをみると「数量文字列(複数形)」ってのも扱ってて
使ったことがないので気になるがこの記事ではやらない。
文字列リソース取得
res/values/strings.xml
上記「strings.xml」ファイルから文字列リソースを取得する方法。
getString(R.string.hello_message); getResources().getString(R.string.hello_message);
これらメソッドはContextクラスのメソッドなので
Contextを持っていない(継承もしていない)クラスは扱えない。
<resources> <string name="hello_message">こんちは、元気かい?</string> </resources>
文字列配列の取得
「strings.xml」ファイルから文字列配列を取得する方法。
String[] hello = getResources().getStringArray(R.array.hello_array);
getStringArray()はResourcesクラスにある。
Contextクラスにはない。
<resources> <string-array name="hello_array"> <item>こんにちは</item> <item>さようなら</item> </string-array> </resources>
文字列の書式設定
「strings.xml」ファイルから書式設定した文字列を取得する方法。
String.format(getString(R.string.play_message), "ゲーム", 360);
<resources> <string name="play_message">今日は、%1$sを%2$d分やるぜ!</string> </resources>
- 出力結果
- 今日は、ゲームを360分やるぜ!
ちなみに、 String.format() をせず、
getString(R.string.play_message)
とだけした場合は
- 出力結果
- 今日は、%1$sを%2$d分やるぜ!
そのまま表示される
文字列の書式設定の番号指定の話
「%1$s」と「%2$d」で書式設定した部分は
「%s」と「%d」と置き換えても同じ結果になる。
<resources> <string name="play_message">今日は、%1$sを%2$d分やるぜ!</string> <string name="play_message2">今日は、%sを%d分やるぜ!</string> </resources>
番号指定がなくても左から順番に値が使われるみたい。
番号指定と混じってる場合(間違い編)
以下のように「%s」と「%1$s」を混ぜてみる。
<string name="play_message3">今日は、%sを%d分やるぜ!目標は%1$s</string>
引数は「%s」、「%d」、「%1$s」の3つ分用意して String.format() する
String playGame = String.format(getString(R.string.play_message3), "ゲーム", 360, "全クリだ!");
- するとエラーが…
-
Wrong argument count, format string play_message3 requires 2 but format call supplies 3 less…
ということでコーディングエラーになる。
「play_message3」に対して必須となる引数は2つだけよ!
ってことなので、最初の「%s」は「%1$s」と同じ意味になりそうだ。
番号指定と混じってる場合(正解編)
番号指定がなくても内部で番号を持っているみたいなので
文字列の引数を番号指定で追加する場合は、以下のようにする。
<string name="play_message4">今日は、%sを%d分やるぜ!目標は%3$s</string>
「%2$s」ではなく「%3$s」なので注意。
String playGame = String.format(getString(R.string.play_message3), "ゲーム", 360, "全クリだ!");
- 出力結果
- 今日は、ゲームを360分やるぜ!目標は全クリだ!
ということで、formatの指定が違えば実行時エラーになるし
引数の指定順がこんがらがるし可読性低いので
番号指定を混ぜて指定するのは良くない(やる人もいないだろうけど)。
ディスカッション
コメント一覧
まだ、コメントがありません