リソースとは


Androidでいうリソースとはソースコードの外にあるデータのことを指します。
Androidでは以下のようなデータをリソースとして定義することができます。

  • 色(フォントや背景などの色を指定する数値)
  • 文字列(ボタンなどに表示する文字列値)
  • 寸法(ボタンなどのサイズを指定する数値)
  • 描画(PNGやJPGなどの画像)
  • アニメーション(アニメーション動作の定義情報)
  • メニュー(メニューに表示する文字列値)
  • レイアウト(アクティビティのレイアウト情報)

リソースを作る

リソースの作成はres/以下にデータを追加するだけなのですが、
データの種類によって格納するサブディレクトリが異なります。
PNGやJPGなどの画像ファイルはres/drawable以下、
色や文字列などを定義するXMLファイルはres/values以下、という具合です。

ディレクトリ リソースタイプ
res/anim/ アニメーション動作を定義したXMLファイルを格納する。
res/drawable/ 画像ファイルを格納する。
res/layout/ アクティビティのレイアウトを定義したXMLファイルを格納する。
res/values/ 色、文字列、寸法などを定義したXMLファイルを格納する。
res/xml/ 任意のXMLファイルを格納する。
res/raw/ デバイスに直接コピーされるファイルを格納する。

リソースを使う

リソースを作るとR.javaというファイルに「コードからリソースを使うために必要となる情報」が自動的に追記されます。以下にR.javaを示します。

package com.android.samples;
public final class R {
    public static final class string {
        public static final int greeting=0x0204000e;
        public static final int start_button_text=0x02040001;
        public static final int submit_button_text=0x02040008;
        public static final int main_screen_title=0x0204000a;
    };
    public static final class layout {
        public static final int start_screen=0x02070000;
        public static final int new_user_pane=0x02070001;
        public static final int select_user_list=0x02070002;

    };
    public static final class drawable {
        public static final int company_logo=0x02020005;
        public static final int smiling_cat=0x02020006;
        public static final int yellow_fade_background=0x02020007;
        public static final int stretch_button_1=0x02020008;

    };
};

このR.javaをじっくり眺めるとリソースタイプごとにクラスが定義されていることがわかると思います。
各クラスの各フィールドが追加したリソースに対応しており、ソースコードからはこのフィールドを指定することで任意のリソースを使うことができるというわけです。
たとえばリソースの背景画像を設定する場合は以下のようにします。

// Load a background for the current screen from a drawable resource.
this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image);

リソースを使うメリット

文字列などはわざわざリソースとして定義せずにコードに直接記述することも可能です。
ですが、たとえば同じ文字列を繰り返し使っているコードがあった場合、あとでその文字列に
変更が発生するとその修正箇所は多くなってしまいます。
こういったケースを避けるため、Androidではリソースを使うことを推奨しています。

One Comment