文字列リソースには書式文字列を使用することができる。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hoge">hello! name: %s</string>
</resources>
val str = context.getString(R.string.hoge, "suihan")
▼実行結果hello! name: suihan
このもっとも簡単な例のように書式引数が一つだけのときはこれで問題ないが、書式引数が複数ある場合に次のようにすると、ビルド時に「Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
」というような警告文が表示される。
<string name="hoge">hello! firstName: %s, lastName: %s</string>
val str = context.getString(R.string.hoge, "taro", "tanaka")
▼実行結果hello! firstName: taro, lastName: tanaka
これは要するにContext#getString
の各引数がそれぞれどの書式引数に割り当てられるかということをハッキリさせろということであり、指定しなければ警告とともにとりあえず左から順番に割り当てられていく。
そうしたとき、名前のように「姓→名」で表示する場合と「名→姓」で表示する場合が言語によって異なるような文字列において問題が発生するので、次のように文字列リソース側で割り当てる引数の添え字(1始まり)を指定する。
<string name="hoge">hello! firstName: %1$s, lastName: %2$s</string>
<string name="hoge">こんにちは! 姓: %2$s, 名: %1$s</string>
val str = context.getString(R.string.hoge, "taro", "tanaka")
▼実行結果
英語の場合 -> hello! firstName: taro, lastName: tanaka
日本語の場合 -> こんにちは! 姓: tanaka, 名: taro