R.javaファイルとリソースID

広告

プロジェクトに設置したリソースをプログラムの中から利用するため、各リソースにはリソースIDが割り当てられます。リソースIDは「R.java」と言う名前のファイルで管理されます。

「R.java」ファイルは初めてプロジェクトをビルドした時に作成され、その後ビルドが行われるたびに自動的に更新されていきます。その為、ユーザーはリソースの追加だけを行っておけばリソースに対するIDの管理などは行う必要がありません。

では対象となるプロジェクトをビルドしてみます。

p2-1

一度ビルドを実行するとプロジェクトの中の「gen」ディレクトリの中に「R.java」ファイルが作成されます。

p2-2

「R.java」はJavaのソースファイルですのでダブルクリックすると中央のソースエディタに「R.java」の中身が表示されます。

p2-3

ファイルでは「R」クラスが定義されています。さらにサブクラスとしてリソースの種類ごとに「drawable」クラスや「layout」クラスが定義されています。

各クラスファイルの中ではint型の値が定義されています。これがリソースに対するリソースIDとなります。リソースIDの割り当てはリソースの種類によって異なります。

例えば「layout」の場合にはレイアウト用XMLファイルのファイル名に対してリソースIDが割り当てられています。現在は「main.xml」ファイルが格納されています。

p2-4

この場合、リソースIDはファイル名に対して次のように割り当てられています。

public static final class layout {
    public static final int main=0x7f030000;
}

それに対して「values」の場合には、XMLファイルの中で各要素に付けられた名前に対してリソースIDが割り当てられます。現在は「strings.xml」ファイルが格納されています。

p2-5

このファイルをダブルクリックするとソースエディタの場所にXMLファイルの内容が次のように表示されます。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ResourceActivity!</string>
    <string name="app_name">Sampleプログラム</string>
</resources>

2つの「string」要素が記述され、それぞれ名前として「hello」と「app_name」が付けられています。この場合、リソースIDは次のように割り当てらます。

public static final class string {
    public static final int app_name=0x7f040001;
    public static final int hello=0x7f040000;
}

また画像ファイルは次のように3つのディレクトリに同じファイル名のファイルが格納されています。

p2-6

端末の解像度などに応じて適切な画像が使われるようにディレクトリが分かれてはいますが、いずれのディレクトリの画像を使用するのかの判断はandroid側で自動的に行われますので、プログラムなどからリソースを参照する場合はあくまで同じリソースとして扱います。その為、それぞれのディレクトリに対してクラスが用意されるのではなく「drawable」クラスの中で画像のファイル名に対してリソースIDが割り当てられます。

public static final class drawable {
    public static final int icon=0x7f020000;
}

このように配置されたリソースに対してリソースIDが自動で割り当てられます。

自動的に更新

リソースIDはプログラムがビルドされるたびに自動的に更新されます。例として画像ファイルをリソースとして追加してみます。

p2-7

「drawable-mdpi」ディレクトリに「title.png」を追加しました。

ではプロジェクトをビルドして下さい。そしてその後で「R.java」ファイルの中身を確認して下さい。

p2-8

「drawable」クラスの中に新たに「title」に対するリソースIDが設定されています。このようにリソースを更新すれば自動的にリソースIDが更新されていることが確認できます。

( Written by Tatsuo Ikura )