リソースとは、コードが使用する追加のファイルと静的コンテンツであり、ビットマップ、レイアウト定義、ユーザー インターフェース文字列、アニメーション命令などがあります。
画像や文字列などのアプリリソースは必ずコードとは別にします。それにより、コードとは独立して管理できるようになります。また、代替リソースは、異なる名前を付けたリソース ディレクトリに分類してデバイス構成ごとに指定します。実行時に、Android は現在の設定に基づいて適切なリソースを使用します。たとえば、画面サイズごとに異なる UI レイアウトや言語設定ごとに異なる文字列を指定できます。
アプリリソースをコードとは別にした場合、そのリソースにアクセスするには、プロジェクトの R クラスで生成されたリソース ID を使用します。このドキュメントでは、Android プロジェクトでのリソースの分類方法と、デバイス構成ごとの代替リソースの指定方法、またそれらのリソースにアプリコードやその他の XML ファイルからアクセスする方法について説明します。
グループ リソースのタイプ
リソースはタイプごとにプロジェクトの res/ ディレクトリの対応するサブディレクトリに保存します。たとえば、単純なプロジェクトのファイル階層の例を次に示します。
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
res/ ディレクトリのサブディレクトリにすべてのリソース(画像リソース、2 つのレイアウト リソース、ランチャー アイコン用の mipmap/ ディレクトリ、文字列リソース ファイル)が保存されています。リソース ディレクトリ名は重要です。これについては表 1 で説明しています。
表 1. プロジェクトの res/ ディレクトリ内でサポートされるリソース ディレクトリ
ディレクトリ |
リソースの種類 |
|
|
プロパティ アニメーションを定義する XML ファイル。 |
|
|
トゥイーン アニメーションを定義する XML ファイル。プロパティ アニメーションもこのディレクトリに保存できますが、この 2 種類を区別するために、プロパティ アニメーションは |
|
|
色状態リストを定義する XML ファイル。詳細については、色状態リストのリソースをご覧ください。 |
|
|
次のドローアブル リソースのサブタイプにコンパイルされるビットマップ ファイル(PNG、.
詳しくは、ドローアブル リソースをご覧ください。 |
|
|
ランチャー アイコンの密度に応じたドローアブル ファイル。 |
|
|
ユーザー インターフェースのレイアウトを定義する XML ファイル。詳しくは、レイアウト リソースをご覧ください。 |
|
|
アプリメニュー(オプション メニュー、コンテキスト メニュー、サブメニューなど)を定義する XML ファイル。詳細については、メニュー リソースをご覧ください。 |
|
|
未加工の形式で保存する任意のファイル。このリソースを未加工の ただし、元のファイル名とファイル階層にアクセスする必要がある場合は、リソースの一部を |
|
|
単純な値(文字列、整数、色など)を保存する XML ファイル。 他の リソースはそれぞれ独自の XML 要素で定義されるので、ファイルに自由に名前を付けてさまざまなリソースタイプを 1 つのファイルに保存できます。ただし、明確にするために記すと、一意のリソースタイプを異なるファイルに配置することもできます。このディレクトリに作成できるリソースのファイル名規則の例を次に示します。 詳しくは、文字列リソース、スタイル リソース、その他のリソースタイプをご覧ください。 |
|
|
実行時に |
|
|
TTF、OTF、TTC などの拡張子を持つフォント ファイル、または |
表 1 で定義したサブディレクトリに保存するリソースは、デフォルトのリソースです。つまり、このリソースではアプリのデフォルトのデザインとコンテンツを定義します。しかし、Android 搭載デバイスの種類が異なれば、要求されるリソースタイプも異なる可能性があります。
たとえば、通常の画面よりも大きいデバイスに対しては別のレイアウト リソースを使用することにより、追加の画面領域を活用できます。デバイスの言語設定に基づいて、ユーザー インターフェースのテキストを翻訳するさまざまな文字列リソースを使用することもできます。さまざまなデバイス構成向けに異なるリソースを指定するには、デフォルトのリソースに加えて、代替リソースを準備する必要があります。
代替リソースの指定
ほとんどのアプリで、デバイスの構成ごとに代替リソースを用意する必要があります。たとえば、各種の画面密度に対応した代替のドローアブル リソースや、各種の言語に対応した代替の文字列リソースを追加します。実行時に、Android によって現在のデバイス構成が自動的に検出され、アプリに適したリソースが読み込まれます。

図 1. 画面サイズに応じて異なるレイアウト リソースを使用する 2 つのデバイス。
リソースセットに対応した構成固有の代替リソースを指定する手順は次のとおりです。
res/の中に、<resources_name>-<qualifier>という形式の名前で新しいディレクトリを作成します。<resources_name>は、対応するデフォルトのリソースのディレクトリ名です(表 1 で定義)。<qualifier>は、そのリソースが使用される個々の構成を指定する名前です(表 2 で定義)。
<qualifier>は複数追加できます。それらはダッシュ記号でつなぎます。この新しいディレクトリに適切な代替リソースを保存します。リソース ファイルにはデフォルトのリソース ファイルと同じ名前を付ける必要があります。
デフォルトのリソースと代替リソースの例を次に示します。
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi 修飾子は、そのディレクトリにあるリソースが高密度画面を備えたデバイス用であることを示します。これらのドローアブル ディレクトリにある画像のサイズは画面密度ごとに調整されていますが、ファイル名は同じです。このように、icon.png や background.png の画像を参照する際に使用するリソース ID は常に同じです。Android では、デバイス構成情報をリソース ディレクトリ名の修飾子と比較することで、現在のデバイスに最も適したバージョンのリソースをそれぞれ選択します。
表 2 では、有効な構成修飾子の一覧を優先度の高い順に示します。複数の修飾子をダッシュ記号でつなぐことで 1 つのディレクトリ名に追加できます。リソース ディレクトリで複数の修飾子を使用する場合は、それらを表に記載されている順序でディレクトリ名に追加する必要があります。
表 2. 構成修飾子の名前。
構成 |
修飾子の値 |
説明 |
MCC と MNC |
例:
|
デバイスの SIM カードに登録されているモバイル カントリー コード(MCC)。必要に応じて直後にモバイル ネットワーク コード(MNC)が付きます。たとえば、 無線接続を使用しているデバイス(GSM フォン)の場合、MCC と MNC の値は SIM カードから取得されます。 MCC のみを使用することもできます(たとえば、アプリに国別の法的リソースを含める場合など)。言語だけに基づいて指定する必要がある場合は、代わりに言語、文字(省略可)、地域(省略可)の修飾子を使用してください。MCC および MNC 修飾子の使用には注意が必要です。想定どおりに動作することをテストしてください。 また、現在のモバイル カントリー コードを示す構成フィールド |
言語、文字(省略可)、地域(省略可) |
例:
|
言語は 2 文字の ISO 639-2{:.external} 言語コードによって定義され、必要に応じて 2 文字の ISO 3166-1-alpha-2{:.external} 地域コード(先頭は小文字の コードの大文字と小文字は区別されません。 Android 7.0(API レベル 24)では、BCP 47 言語タグ{:.external}のサポートが導入され、言語と地域に固有のリソースを修飾できるようになりました。言語タグは 1 つ以上のサブタグで構成されます。各サブタグは、タグ全体で識別される言語の範囲を絞り込むために使用されます。言語タグについて詳しくは、言語の識別タグ{:.external}をご覧ください。 BCP 47 言語タグを使用するには、 ユーザーがシステム設定で言語を変更すると、アプリの実行中に言語タグが変わる可能性があります。このことが実行時にアプリに与える影響について詳しくは、設定の変更に対処するをご覧ください。 他の言語向けにアプリをローカライズする方法については、アプリをローカライズするをご覧ください。 定義されたロケールのリストを提供する |
| 文法性 | masculinefeminineneuter |
ユーザーの文法上の性別。文法上の性別がある言語で使用されます。 たとえば、フランス語を話すユーザー向けに異なるリソースを提供する必要がある場合は、次のようなディレクトリを使用できます。
Android の Grammatical Inflection をご覧ください。 文法上の性別を示す API レベル 34 で追加されました。 |
レイアウト方向 |
|
アプリのレイアウト方向。 この修飾子はレイアウト、ドローアブル、値など、どのリソースにも適用できます。 たとえば、アラビア語向けに特別なレイアウトを用意し、他の「右から左に読む」言語(ペルシャ語やヘブライ語など)向けに一般的なレイアウトを用意する場合は、次のようなディレクトリを使用します。
注: アプリで右から左に読むレイアウト機能を有効にするには、 API レベル 17 で追加されました。 |
最小幅 |
例:
その他 |
アプリで使用可能な画面領域の縦横のうち短い方の寸法。具体的には、アプリのウィンドウの たとえば、画面領域の最小ディメンションが常に 600 dp 以上である必要があるレイアウトについては、この修飾子を使用して 幅は多くの場合レイアウトの設計における重要な要因であるため、最小幅に基づいて一般的な画面サイズを決定すると便利です。UI は垂直方向にスクロールすることが多いものの、水平方向で必要な最小スペースについては厳しい制約があります。 使用可能な幅は、スマートフォン向けの単一ペインのレイアウトを使用するか、タブレット向けのマルチペインのレイアウトを使用するかを判断するうえでも重要な要素となります。このように、各デバイスで使用可能な幅の最小値の特定は非常に重要です。 デバイスの最小幅は、画面のデザインとシステム UI を考慮した値です。たとえば、デバイスの画面上に常駐の UI 要素があり、それが最小幅の軸に沿ってスペースを占有している場合、それらの UI 要素はアプリの UI に使用できない画面ピクセルとなるため、システムは最小幅を実際の画面サイズより小さい値として宣言します。 一般的な画面サイズの場合にここで使用する値は次のとおりです。
アプリで API レベル 13 で追加されました。 アプリが対応する最小の この修飾子を使用したさまざまな画面のデザインについて詳しくは、ビューを使用したレスポンシブ/アダプティブ デザインをご覧ください。 |
利用可能な幅と高さ |
例:
その他 |
リソースに適用する画面の幅または高さの最小値を 多くの場合、利用可能な幅と高さは、マルチペイン レイアウトを使用するかどうかの判断に役立ちます。タブレットの場合を含め、縦向きと横向きで同じマルチペイン レイアウトを使用することは通常はないためです。これらの値を使用すれば、画面のサイズと画面の向きの両方の修飾子を使用しなくても、レイアウトに必要な幅または高さの最小値を指定できます。 アプリでこの構成に異なる値を指定した複数のリソース ディレクトリを用意している場合、システムはデバイスの現在の幅に最も近く、上回らない値を持つリソース ディレクトリを使用します。最も近い値は、実際の画面の幅と指定した幅の差に、実際の画面の高さと指定した高さの差を足した値に基づいて判断されます。高さと幅を指定していない場合、値は 0 となります。 値には、ウィンドウ インセットによって占有される領域は含まれません。そのため、デバイスのディスプレイの端に常駐の UI 要素がある場合、アプリが 固定されていない縦向き画面の装飾(全画面表示時に非表示にできるスマートフォンのステータスバーなど)は、ここでは考慮されていません。タイトルバーやアクションバーなどのウィンドウ装飾も同様です。そのため、アプリは指定したサイズよりもやや小さいスペースに対応できるように準備する必要があります。 注: システムでは、幅と高さの両方が一致するリソースが選択されます。したがって、どちらか一方のみが指定されたリソースより、両方が指定されたリソースの方が優先順位が高くなります。たとえば、実際の画面が幅 720 dp、高さ 1280 dp で、1 つのリソースの修飾子が w720dp であり、別のリソースの修飾子が w700dp-h1200dp である場合は、指定されたリソースと完全に一致するのが前者である場合でも、後者が選択されます。 API レベル 13 で追加されました。 現在の画面の幅と高さを保持する この修飾子を使用したさまざまな画面のデザインについて詳しくは、ビューを使用したレスポンシブ/アダプティブ デザインをご覧ください。 |
画面サイズ |
|
注: サイズ修飾子を使用した場合、リソースがそのサイズの画面でしか使われないということではありません。現在のデバイス構成により適した修飾子付きの代替リソースが用意されていない場合、システムは最も適しているいずれかのリソースを使用できます。 注意: すべてのリソースで現在の画面よりも大きなサイズ修飾子を使用している場合、システムはそれらのリソースを使用せず、アプリは実行時にクラッシュします。たとえば、すべてのレイアウト リソースに API レベル 4 で追加されました。 画面が small、normal、large のどれなのかを示す 詳しくは、画面の互換性の概要をご覧ください。 |
画面のアスペクト |
|
API レベル 4 で追加されました。 これは画面のアスペクト比だけに基づくものです( 画面が長いかどうかを示す |
円形の画面 |
|
API レベル 23 で追加されました。 画面が円形かどうかを示す |
広色域 |
|
API レベル 26 で追加されました。 画面の色域が広いかどうかを示す |
ハイ ダイナミック レンジ(HDR) |
|
API レベル 26 で追加されました。 画面が HDR 対応かどうかを示す |
画面の向き |
|
ユーザーが画面を回転させた場合、アプリの実行中に変更される可能性があります。このことが実行時にアプリに与える影響について詳しくは、実行時の変更の処理をご覧ください。 現在のデバイスの向きを示す |
UI モード |
|
API レベル 8 で追加されました。television は API 13、appliance は API 16、watch は API 20、vrheadset は API 26 で追加されました。 デバイスをホルダーに装着した場合と取り外した場合のアプリの反応について詳しくは、装着状態とタイプを特定して監視するをご覧ください。 ユーザーがデバイスをホルダーに置いた場合、この設定はアプリの実行中に変更される可能性があります。このモードの一部を有効または無効にするには |
夜間モード |
|
API レベル 8 で追加されました。 夜間モードが自動モードのままにされている場合(デフォルト)、アプリの実行中に変更される可能性があります。自動モードでは、時間帯に応じてモードが変更されます。このモードを有効または無効にするには、 |
画面のピクセル密度(dpi) |
|
6 つの主要な密度の間には 3:4:6:8:12:16 というスケーリング比があります(tvdpi 密度は無視してください)。そのため、ldpi の 9x9 ビットマップは、mdpi では 12x12、hdpi では 18x18、xhdpi では 24x24 になります。 注: 密度修飾子を使用した場合でも、リソースはその密度の画面のみで使用されるわけではありません。現在のデバイス構成により適した修飾子付きの代替リソースが用意されていない場合、システムは最も適しているいずれかのリソースを使用できます。 さまざまな画面密度の処理方法や、現在の密度に合わせてビットマップが拡大縮小される仕組みについて詳しくは、画面の互換性の概要をご覧ください。 |
タッチスクリーンのタイプ |
|
デバイスのタッチスクリーンのタイプを示す |
キーボードを使用できるかどうか |
|
ユーザーがハードウェア キーボードを表に出した場合、アプリの実行中に変更される可能性があります。このことが実行時にアプリに与える影響について詳しくは、実行時の変更の処理をご覧ください。 また、構成フィールド |
メインのテキスト入力方法 |
|
使用できるメインのテキスト入力方法を示す |
ナビゲーション キーを使用できるかどうか |
|
ユーザーがナビゲーション キーを表に出した場合、アプリの実行中に変更される可能性があります。このことが実行時にアプリに与える影響について詳しくは、実行時の変更の処理をご覧ください。 ナビゲーション キーが隠れているかどうかを示す |
タッチ以外のメインのナビゲーション方法 |
|
使用できるナビゲーション方法の種類を示す |
プラットフォームのバージョン(API レベル) |
例:
その他 |
デバイスでサポートされている API レベル。たとえば、API レベル 1(Android 1.0 以降のデバイス)では |
修飾子の命名規則
構成修飾子の名前を使用する場合の規則は次のとおりです。
- 複数の修飾子をダッシュ記号でつないで 1 つのリソースセットとして指定できます。たとえば
drawable-en-rUS-landは、言語が英語(米国)で横向きのデバイスに適用されます。 - 修飾子は表 2 に記載されている順序で指定する必要があります。
- 不適切:
drawable-hdpi-port/ - 適切:
drawable-port-hdpi/
- 不適切:
- 代替リソース ディレクトリはネストできません。たとえば、
res/drawable/drawable-en/のようにはできません。 - 値は大文字と小文字が区別されません。大文字と小文字が区別されないファイル システムで問題が生じるのを避けるため、リソース コンパイラでは処理の前にディレクトリ名が小文字に変換されます。大文字を使用するのは単に名前を読みやすくする場合だけです。
- 修飾子の種類ごとに 1 つの値だけを指定できます。たとえば、スペインとフランスで同じドローアブル ファイルを使用する場合、
drawable-es-fr/というディレクトリは作成できません。その場合は、drawable-es/とdrawable-fr/というように、それぞれのファイルを保存する 2 つのリソース ディレクトリが必要になります。ただし、両方の場所でファイルを実際に複製する必要はありません。代わりに、エイリアス リソースの作成セクションで説明されているように、リソースにエイリアスを作成できます。
この修飾子で名前を付けたディレクトリに代替リソースを保存すると、現在のデバイス構成に基づいてアプリのリソースが自動的に適用されます。リソースが必要になるたびに、必要なリソース ファイルが保存されている代替リソース ディレクトリが調べられ、最適なリソースが見つけられます。
デバイス構成に一致する代替リソースがない場合は、対応するデフォルトのリソースが使用されます。デフォルトのリソースとは、特別なリソースタイプに用意された、構成修飾子が付かないリソースセットです。
エイリアス リソースの作成
あるリソースを複数のデバイス構成で使用したいが、デフォルトのリソースにはしたくない場合、その同じリソースを複数の代替リソース ディレクトリに保存する必要はありません。代わりに、デフォルトのリソース ディレクトリに保存したリソースのエイリアスとして機能する代替リソースを作成できます。
たとえば、icon.png というアプリアイコンがあり、ロケールごとに固有のバージョンが必要だとします。しかし、English-Canadian と French-Canadian の 2 つのロケールについては同じバージョンを使用する必要があるとします。この場合、English-Canadian 用と French-Canadian 用の両方のリソース ディレクトリに同じ画像をコピーする必要はありません。代わりに、両方に使用する画像を icon.png 以外の任意の名前(icon_ca.png など)で保存し、デフォルトの res/drawable/ ディレクトリに置くことができます。次に、res/drawable-en-rCA/ と res/drawable-fr-rCA/ に、<bitmap> 要素を使用して icon_ca.png リソースを参照する icon.xml ファイルを作成します。こうすることで、PNG ファイルの 1 つのバージョンと、それを参照する 2 つの小さな XML ファイルを保存するだけで済みます。詳しくは、次のセクションの例をご覧ください。
ドローアブル
既存のドローアブルのエイリアスを作成するには、<drawable> 要素を使用します。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="icon">@drawable/icon_ca</drawable>
</resources>
このファイルを res/values-en-rCA/ などの代替リソース ディレクトリに icon.xml として保存した場合、ファイルは R.drawable.icon として参照できるリソースにコンパイルされますが、実際には R.drawable.icon_ca リソースのエイリアスになり、res/drawable/ に保存されます。
レイアウト
既存のレイアウトのエイリアスを作成するには、<merge> でラップされた <include> 要素を使用します。
<?xml version="1.0" encoding="utf-8"?>
<merge>
<include layout="@layout/main_ltr"/>
</merge>
このファイルを main.xml として保存した場合、ファイルは R.layout.main として参照できるリソースにコンパイルされますが、実際には R.layout.main_ltr リソースのエイリアスになります。
アプリのリソースにアクセスする
アプリでリソースを指定したら、そのリソース ID を参照して適用できます。すべてのリソース ID は、aapt ツールによって自動的に生成される、プロジェクトの R クラスで定義されます。
アプリがコンパイルされると、aapt が R クラスを生成します。このクラスには、res/ ディレクトリ内のすべてのリソースのリソース ID が含まれています。リソースのタイプごとに R サブクラスがあります。たとえば、R.drawable はすべてのドローアブル リソースに対応します。また、そのタイプのリソースごとに静的整数があります(たとえば R.drawable.icon)。この整数は、リソースの取得に使用できるリソース ID です。
R クラスはリソース ID を指定するために使用されますが、リソース ID を検出するためにこれを確認する必要はありません。リソース ID は常に次の要素で構成されます。
- リソースタイプ: 各リソースは
string, drawable、layoutなどの「タイプ」に分類されます。さまざまなタイプの詳細については、リソースタイプの概要をご覧ください。 - リソース名。ファイル名(拡張子を除く)、または XML
android:name属性の値(リソースが文字列などの単純な値の場合)。
リソースにアクセスするには、次の 2 つの方法があります。
- コードの場合:
Rクラスのサブクラスの静的整数を使用します。例:R.string.hellostringはリソースタイプ、helloはリソース名です。この形式でリソース ID を指定すると、多くの Android API がリソースにアクセスできます。詳細については、コード内でリソースにアクセスするをご覧ください。 - XML の場合:
Rクラスで定義されたリソース ID に対応する特別な XML 構文を使用します。次に例を示します。@string/hellostringはリソース タイプ、helloはリソース名です。この構文は、リソースで指定している値が予期される XML リソース内の任意の場所に使用できます。詳しくは、XML からリソースにアクセスするをご覧ください。
コード内でリソースにアクセスする
コード内でリソースを使用するには、リソース ID をメソッド パラメータとして渡します。たとえば、setImageResource を使用して res/drawable/myimage.png リソースを使用するように ImageView を設定できます。
Kotlin
val imageView = findViewById(R.id.myimageview) as ImageView
imageView.setImageResource(R.drawable.myimage)
Java
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 で取得できます。
コード内でリソースにアクセスする例を次に示します。
Kotlin
// Load a background for the current screen from a drawable resource.
window.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.
window.setTitle(resources.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.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in))
// Set the text on a TextView object using a resource ID.
val msgTextView = findViewById(R.id.msg) as TextView
msgTextView.setText(R.string.hello_message)
Java
// 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.
flipper.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);
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:textColor の値として、android:textColorSecondary スタイル属性に適用された値が使用されるようになりました。このコンテキストでは属性リソースを指定することをシステム リソース ツールが認識しているため、型(?android:attr/textColorSecondary)を明示的に記述する必要はありません。attr 型は除外できます。
元のファイルにアクセスする
場合によっては、元のファイルとディレクトリへのアクセスが必要になることがあります。その場合、res/ からリソースを読み取るにはリソース ID を使用するしかないため、res/ にファイルを保存するのは適切ではありません。代わりに、assets/ ディレクトリにリソースを保存します。
assets/ ディレクトリに保存されているファイルにはリソース ID が割り当てられないため、R クラスや XML リソースから参照することはできません。代わりに、通常のファイル システムと同様に assets/ ディレクトリ内のファイルをクエリし、AssetManager を使用して元データを読み取ることができます。
ただし、元データ(動画や音声ファイルなど)を読み取るだけでよい場合は、res/raw/ ディレクトリにファイルを保存し、openRawResource を使用してバイト ストリームとして読み取ります。
プラットフォーム リソースにアクセスする
Android には、スタイル、テーマ、レイアウトなど、さまざまな標準リソースが含まれています。これらのリソースにアクセスするには、リソース参照を android パッケージ名で修飾します。たとえば、Android には、ListAdapter 内のリストアイテムに使用できるレイアウト リソースが用意されています。
Kotlin
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
Java
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
この例の simple_list_item_1 は、ListView 内のアイテムに対してプラットフォームが定義したレイアウト リソースです。これは、リストアイテム用に独自のレイアウトを作成する代わりに使用できます。
リソースに関するデバイスの互換性を最適に保つ
アプリで複数のデバイス構成をサポートするには、アプリが使用するリソースのタイプごとにデフォルトのリソースを準備しておくことが重要です。
たとえば、アプリで複数の言語をサポートする場合は、必ず、言語と地域の修飾子を付けない values/ ディレクトリを用意しておきます(このディレクトリに文字列を保存します)。このようにせず、言語と地域の修飾子を付けたディレクトリにすべての文字列ファイルを保存した場合、文字列が対応していない言語に設定されたデバイス上でアプリが実行されたとき、アプリはクラッシュします。
デフォルトの values/ リソースを用意しておけば、ユーザーがその言語を理解しないとしても、アプリは適切に実行されます。クラッシュするよりはるかによいでしょう。
同様に、画面の向きに基づいて異なるレイアウト リソースを指定する場合は、どちらかの向きをデフォルトとして選択します。たとえば、横向き用の layout-land/ と縦向き用の layout-port/ にレイアウト リソースを保存するのではなく、どちらか一方にデフォルトの場所を割り当て、横向き用に layout/、縦向き用に layout-port/ のようにします。
デフォルトのリソースを準備しておくことが重要なのは、アプリが予期しない構成で実行される場合があるだけでなく、Android の新しいバージョンには、古いバージョンでサポートしていない構成修飾子が追加されることがあるためです。新しいリソース修飾子を使用し、古いバージョンの Android とのコード互換性も保つ場合、デフォルトのリソースを用意しておかないと、古いバージョンの Android でアプリが実行されたとき、アプリは新しい修飾子が名前に付いたリソースを使用できないため、クラッシュします。
たとえば、minSdkVersion を 4 に設定し、夜間モード(API レベル 8 で追加された night または notnight)を使用してすべてのドローアブル リソースを修飾するとします。その場合、API レベル 4 のデバイスはドローアブル リソースにアクセスできず、クラッシュします。これに対処するには、notnight をデフォルトのリソースにして、問題の修飾子は使用せず、ドローアブル リソースを drawable/ と drawable-night/ に用意します。
簡単に言えば、デバイスの互換性を適切に保つには、アプリを正しく実行するために必要なリソースについて、必ずデフォルトのリソースを用意しておきます。そのうえで、構成修飾子を使って個々のデバイス構成用に代替リソースを作成します。
このルールには 1 つだけ例外があります。アプリの minSdkVersion が 4 以上で、画面密度の修飾子を付けた代替ドローアブル リソースを用意した場合は、デフォルトのドローアブル リソースは必要ありません。デフォルトのドローアブル リソースがなくても、Android は代替の画面密度から最適な密度を見つけて、必要に応じてビットマップを拡大縮小できます。ただし、すべての種類のデバイスで最良のエクスペリエンスを提供するには、3 種類の密度のすべてについて代替のドローアブル リソースを用意してください。