作り始めて、意外と楽しくてメモが増えてるw
Androidアプリケーションを作るためのプロジェクトをEclipseで新規作成すると、一杯フォルダができる。
そして、このフォルダたち、それぞれ役割があって、きっと、それらの中でも良くお世話になるのが、resource関連だと思うの。
たとえば、サイコロアプリをつくりたいなーとか考えた時、画面やボタン、メッセージなんかは日本語かもしれないし、他の国の人が使えば、他の国の言葉の表示も必要になる。
そんな時、このリソースファイルに定義をまとめて作っておくことで、色々と作業が楽になるんだなってことが判ってきた。
たとえば、/res/value フォルダのstrings.xml
今は日本語でつくってるけど、国際化対応では、このファイルをフォルダごと増殖させてフォルダ名に国コードを設定して中身を対応しておけば、あとはAndroidさんが使っている人のネイティヴ言語と比較して、使えそうなものをチョイスしてくれる仕掛けみたいね。
とりあえず、日本語で今は作ってるけどw
で、話を戻して、そのstring.xmlに、ちょこっと登録。
<resources>
<string name="app_name">Simple Dice</string>
<!-- ErrorMessage -->
<string name="DRIE0001">日本語だよ</string>
<!-- Setting -->
<item name="DSIZE_MAX" type="integer">200</item>
</resources>
これだけで、ソースコードからはID:DRIE0001、ID:DSIZE_MAX のリソースとして中身が認識できるようになる。
そこで、Contextオブジェクトを参照できるクラスで、取得用のメソッドを作っておいて、
public String getResourceString(int ID){
return getContext().getString(ID);
}
public Integer getResourceInteger(int ID){
return getContext().getResources().getInteger(ID);
}
あとで、このメソッドにIDを渡してやれば、リソースファイルで定義した内容が取れる仕掛け。IDもR.stringクラスやR.integerクラスに登録された状態になっているのでインテリセンスにでてくるから探しに行かなくても大丈夫。
ソースの中で定数定義やら、メッセージ定義やら、そういう固定リソースなものはファイルに出してしまおうね、って事がお作法。うん、覚えた。
後で国際化するにしても、メンテするにしても、リソースファイルの中で完結してくれるなら何よりだよね。
おもしろいなー。こういう仕組み。
以下、呟き。
リソース読み取ればいいって判ったけど、その取得元になるアプリケーションコンテキストの実体は、どこが保持しているんだろう?
アプリケーション起動時、onCreateの段階でもうすでに実体が存在しているので、OSからアプリケーション起動時に、恐らくはシングルトンで作られて、後はそれを提供していく形になってるんじゃないかなぁと考えてる。まぁ、動かして、アドレス見ればわかることだけど、まだきちんと調べてないw
とすると、後続?のクラスたちからコンテキスト使わせるには、そのアドレスを判るように提供する仕組みさえ作っておけば、どこからでもリソース取得できるようになる。具体的には、コンストラクタでコンテキストのアドレス渡してやれば良いってだけだけどね。
ただ、そうすると、反・祖結合、というか、クラス同士の結びつきが相当ベタな形になっちゃうのが、感覚的にどうよ、とか思ったりする。
できるだけ、クラス間って密接な関係取らない方がコード書く時考えること少なくて済むし、バグ探しやすくなるし、リファクタリングしやすくなるし。
そんな風に考えた時、SpringFrameworkってほんと、良くできた仕組みだなぁって思った。
うん、なんとなく、そんなことを思っただけ。