Android 文字列リソースの扱いと取得方法

2019年8月29日

「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の指定が違えば実行時エラーになるし
引数の指定順がこんがらがるし可読性低いので
番号指定を混ぜて指定するのは良くない(やる人もいないだろうけど)。

開発日記

Posted by konp