Resources
スクリプトを記述していると、リソースに指定したものを使いたくなるときがある。
Resources は、そんなときに利用できるクラス。
Android Developers:Context Resources
頻度の高い例として
[android]TextView textView = new TextView();
textView.setText(R.string.hoge);[/android]
なんていうのがあるが、R.string.hoge というのは実は数値でしかないので
setText メソッドに直接使うと変換してくれるが
[android]TextView textView = new TextView();
textView.setText(R.string.hoge + R.string.hoi);[/android]
なんてしてみると楽しいことが起きる。
文字列のつもりで連結させようとしても無理なのだ。
(私が実際にやってしまったのはバレバレ) 🙄
世の中そんなに甘いわけはなく
こういう場合に利用できるのが Resources クラス。
[android]Resources resources = getResources();
String myHoge = resources.getString(R.string.hoge);[/android]
Android Developers:Context getResources
このようにすることで、実際の文字列を取得できるので
後はいつものように処理できる。
Resources クラスのメソッドは、もちろん getString だけではない。
型に合わせて色々あるので、上記ページを参考に。
getIdentifier メソッドはリソース名を動的に設定したい場合に有効。
public int getIdentifier (String name, String defType, String defPackage)
Android Developers:Resources getIdentifier
第1引数:リソース名文字列
第2引数:リソースタイプ文字列
第3引数:パッケージ名文字列
リソースを取得したい場合、私は以下のようにしている。
[android]Resources resources = getResources();
String myHoge = resources.getString(R.string.hoge);
または
String myHoge = getResources().getString(R.string.hoge);[/android]
ところが、hoge の部分を入れ替えたいときがあり
手動(入れ替え分コードを記述するの)では困ることがある。
そんなときは、getIdentifier メソッドの出番。
R.string.hoge
という記述は int 型のオブジェクト。
だから
R.string.hoge0
R.string.hoge1
R.string.hoge2
これらを
R.string.hoge + i
とか
R.string.”hoge” + i
のように記述したくなるがこれはできない。
そこで
[android]for (int i = 0; i < 3; i++) {
// リソース ID を取得
int myInt = getResources().getIdentifier("hoge" + i, "string", getPackageName() );
// 取得したリソース ID を利用して文字列を取得
String myHoge = getResources().getString(myInt);
// 取得した文字列をログへ書き出し
Log.i("Test", myHoge );
}[/android]
このようにしてやることで、動的にリソース名を設定できる。