lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

リソースへのアクセス

アプリケーションでリソースを提供すると(詳細はリソースの提供をご覧ください)、リソース ID を参照することよってリソースを適用できるようになります。 リソース ID はすべてプロジェクトの R クラスで定義します。これは aapt ツールが自動的に生成します。

アプリケーションをコンパイルすると、aaptR クラスを生成します。このクラスには、res/ ディレクトリにある全リソースのリソース ID が含まれます。 リソースのそれぞれのタイプに対して、R サブクラス(例: ドローアブル リソースの場合はすべて R.drawable)があり、そのタイプのそれぞれのリソースには、静的整数(例: R.drawable.icon)があります。 この整数がリソース ID であり、リソースを取得するのに使用できます。

R クラスではリソース ID が指定されていますが、リソース ID を探す必要はありません。 リソース ID は常に次のように構成されます。

  • リソース タイプ:それぞれのリソースは、stringdrawablelayout のようなタイプにグループ化されます。さまざまなタイプに関する詳細は、リソースのタイプをご覧ください。
  • リソース名: これは、拡張子を除外したファイル名か、XML android:name 属性(リソースが文字列などの単純な値の場合)のいずれかになります。

リソースにアクセスするには次の 2 つの方法があります。

  • コード内: R クラスのサブクラスから次のような静的整数を使用します。
    R.string.hello

    string はリソースタイプ、hello はリソース名です。多くの Android API が、リソース ID をこの形式で指定してリソースにアクセスします。 コードでリソースにアクセスするをご覧ください。

  • XML 内: R クラスで定義されたリソース ID に対応する、次のような特殊な XML 構文を使用します。
    @string/hello

    string はリソースタイプ、hello はリソース名です。この構文は、リソースで提供する値が想定される、XML リソース内の任意の場所に使用できます。 XML からリソースにアクセスするをご覧ください。

コードでリソースにアクセスする

リソース ID をメソッド パラメータとして渡すことで、コード内でリソースを使用できます。たとえば、setImageResource() を使って、ImageViewres/drawable/myimage.png リソースを使用するように設定できます。

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

さらに、Resources のメソッドを使用して、個々のリソースを取得することもできます。getResources() を使用すると、そのインスタンスを取得できます。

構文

次の構文を使用して、コード内のリソースを参照します。

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name> は、リソースが配置されるパッケージの名前です(独自のパッケージからリソースを参照する場合は必要ありません)。
  • <resource_type> は、リソースタイプの R サブクラスです。
  • <resource_name> は、拡張子を除くリソース ファイル名か、XML 要素の android:name 属性値(単純な値の場合)のいずれかになります。

リソースタイプの詳細やそれらの査証方法については、リソースのタイプをご覧ください。

使用例

多くのメソッドでリソース ID パラメータを使うことができ、Resources のメソッドを使用すればリソースを取得できます。 Resources のインスタンスは、Context.getResources() で取得できます。

次は、コードのリソースにアクセスする例です。

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

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

警告: R.java ファイルは、プロジェクトのコンパイル時に aapt ツールによって生成されるため、手動で修正しないでください。 変更した場合は、次回のコンパイルの際に上書きされます。

XML からリソースにアクセスする

一部の XML 属性や要素の値は、既存のリソースへの参照を使用して定義できます。 通常は、ウィジェットに文字列や画像を提供するレイアウト ファイルを作成する場合に、この方法を使用します。

たとえば、レイアウトに Button を追加する場合は、次のように、ボタンテキストの文字列リソースを使用します。

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

構文

次の構文を使用して、XML リソース内のリソースを参照します。

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name> は、リソースが配置されるパッケージの名前です(同一のパッケージからリソースを参照する場合は必要ありません)。
  • <resource_type> は、リソースタイプの R サブクラスです。
  • <resource_name> は、拡張子を除くリソース ファイル名か、XML 要素の android:name 属性値(単純な値の場合)のいずれかになります。

リソースタイプの詳細やそれらの査証方法については、リソースのタイプをご覧ください。

使用例

場合によっては、XML の値にリソースを使用する必要がありますが(ウィジェットにドローアブル画像を適用するような場合など)、単純な値を受け入れる XML の任意の場所にリソースを使用できます。 たとえば、カラーリソース文字列リソースを持つ、次のようなリソースがあるとします。

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

これらのリソースを次のようなレイアウト ファイルに使用して、テキストカラーとテキストの文字列を設定できます。

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

この場合、リソースは独自のパッケージ内のものであることから、リソースの参照でパッケージ名を指定する必要はありません。 システム リソースを参照するには、パッケージ名を含める必要があります。 次に例を示します。

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/secondary_text_dark"
    android:text="@string/hello" />

注: アプリケーションを他の言語にローカライズできるように、常に文字列リソースを使用するようにします。代替リソース(ローカライズされた文字列など)の作成方法についての詳細は、代替リソースを提供するをご覧ください。 アプリケーションを他の言語にローカライズするための詳細なガイドは、ローカライズをご覧ください。

XML でリソースを使用すれば、エイリアスを作成することもできます。たとえば、別のドローアブル リソースのエイリアスとなる、次のようなドローアブル リソースを作成できます。

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

これは冗長のように思われますが、代替リソースを使用する場合に大変便利です。詳細は、エイリアス リソースを作成するをご覧ください。

スタイル属性を参照する

スタイル属性リソースを使用すると、現在適用されているテーマの属性の値を参照できます。 スタイル属性を参照すれば、ハードコードした値を指定しなくても、現在のテーマで与えられる標準的なバリエーションに合わせてスタイルを設定して、UI 要素の外観をカスタマイズできます。 本質的に、スタイル属性を参照するというのは、「現在のテーマのこの属性で定義されるスタイルを使用する」という意味になります。

属性スタイルを参照する場合、名前構文は通常のリソース形式とほぼ同じですが、アットマーク(@)の代わりに疑問符(?)を使用します。リソースタイプの部分は省略可能です。 例:

?[<package_name>:][<resource_type>/]<resource_name>

たとえば、次の例では、属性を参照して、テキスト カラーをシステム テーマの「プライマリ」テキスト カラーに合わせて設定します。

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

ここでは、android:textColor 属性で、現在のテーマのスタイル属性の名前を指定しています。 これで Android は、android:textColorSecondary スタイル属性に適用された値を、このウィジェットの android:textColor の値として使用できるようになります。 このコンテキストで属性リソースが必要なことはシステム リソース ツールで認識されているため、タイプ(ここでは ?android:attr/textColorSecondary)を明示的に指定する必要はなく、attr タイプは除外できます。

プラットフォーム リソースにアクセスする

Android には、スタイル、テーマ、レイアウトといった多数の標準的なリソースが用意されています。これらのリソースにアクセスするには、android パッケージ名でリソース参照を修飾します。 たとえば、Android には、ListAdapter のリストアイテムに使用できるレイアウト リソースが用意されています。

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

この例では、simple_list_item_1 は、プラットフォームによって ListView のアイテム向けに定義されるレイアウト リソースです。 リストアイテムに独自のレイアウトを作成する代わりに、このレイアウトを使用できます。 詳細については、List View のデベロッパー ガイドをご覧ください。