リソースは、ビットマップ、レイアウト定義、ユーザー インターフェース文字列、アニメーション命令など、コードが使用する追加ファイルと静的コンテンツです。
画像や文字列といったアプリリソースは、常にコードの外部に置くようにすることで、独立して保持できるようになります。さらに、特別に名前を設定したリソース ディレクトリにグループ化することで、特定の端末設定に代替リソースを提供する必要があります。実行時には、現在の設定に基づいて、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 に説明があります。
注:Mipmap フォルダの使用方法については、プロジェクトの概要の管理をご覧ください。
表 1. プロジェクト res/
ディレクトリ内でサポートされているリソース ディレクトリ
ディレクトリ | リソースタイプ |
---|---|
animator/ |
プロパティ アニメーションを定義する XML ファイル。 |
anim/ |
トゥイーン アニメーションを定義する XML ファイル(プロパティ アニメーションをこのディレクトリに保存することもできますが、2 つのタイプを区別するために、プロパティ アニメーションは animator/ ディレクトリに保存することをお勧めします)。 |
color/ |
色の状態リストを定義する XML ファイル。色状態リストのリソースをご覧ください。 |
drawable/ |
ビットマップ ファイル(
Drawable Resources をご覧ください。 |
mipmap/ |
さまざまなランチャー アイコン密度のドローアブル ファイル。mipmap/ フォルダによるランチャー アイコンの管理方法については、プロジェクトの概要の管理をご覧ください。 |
layout/ |
ユーザー インターフェースのレイアウトを定義する XML ファイル。Layout Resource をご覧ください。 |
menu/ |
オプション メニュー、コンテキスト メニュー、サブメニューといった、アプリメニューを定義する XML ファイル。メニュー リソースをご覧ください。 |
raw/ |
未加工の形式で保存する任意のファイル。これらのリソースを未加工の ただし、元のファイル名とファイル階層にアクセスする必要がある場合は、一部のリソースを |
values/ |
文字列、整数、色など、単純な値を含む XML ファイル。 その他の 各リソースの定義には XML 要素を使用するため、ファイルには任意の名前を設定でき、1 つのファイル内にさまざまなリソースを配置できます。ただし、わかりやすくするために、一意のリソースタイプをそれぞれのファイルに配置することもできます。次は、このディレクトリで作成できるリソースの一部のファイル名規則の例です。
文字列リソース、スタイル リソース、その他のリソースタイプをご覧ください。 |
xml/ |
Resources.getXML() を呼び出すことによって、実行時に読み込むことができる任意の XML ファイル。ここには、検索可能な設定など、各種の XML 構成ファイルが保存されます。
|
font/ |
.ttf 、.otf 、.ttc などの拡張子を持つフォント ファイル、または <font-family> 要素を含む XML ファイル。リソースとしてのフォントの詳細については、XML フォントをご覧ください。
|
注意:リソース ファイルを res/
ディレクトリに直接保存しないでください。コンパイラ エラーの原因になります。
リソースの特定のタイプの詳細については、リソースタイプのドキュメントをご覧ください。
表 1 で定義したサブディレクトリに保存するリソースは、「デフォルト」のリソースとなります。つまり、これらのリソースはアプリのデフォルトのデザインとコンテンツを定義します。ただし、Android が搭載された端末では別のタイプのリソースが呼び出されることがあります。たとえば、端末の画面サイズが通常のものよりも大きな場合、追加の画面スペースを利用する別のレイアウト リソースを提供する必要があります。また、端末の言語設定が異なる場合、使用するユーザー インターフェースのテキストを翻訳する、別の文字列リソースを提供します。さまざまな端末設定にこれらの異なるリソースを提供するには、デフォルトのリソースに加えて、代替リソースを提供する必要があります。
代替リソースを提供する
ほぼすべてのアプリが、特定の端末設定をサポートするための代替リソースを提供します。たとえば、画面密度が異なる場合は代替ドローアブル リソースを含め、言語が異なる場合は代替文字列リソースを含めます。実行時には、Android が現在の端末設定を検出し、アプリに合ったリソースを読み込みます。

図 1. 別のレイアウト リソースを使用する、2 つの異なる端末
一連のリソースに設定固有の代替リソースを指定するには:
res/
配下に、<resources_name>-<config_qualifier>
の形式で名前を付けた新しいディレクトリを作成します。<resources_name>
は、対応するデフォルト リソースのディレクトリ名です(表 1 で定義)。<qualifier>
は、使用するリソースの各構成を指定する名前です(表 2 で定義)。
1 つ以上の
<qualifier>
を末尾に追加できます。それぞれの修飾子はダッシュを使用して区切ります。注意:複数の修飾子を末尾に追加する場合は、表 2 に記載されているのと同じ順番で配置する必要があります。修飾子の順番に誤りがあると、リソースが認識されません。
- それぞれの代替リソースをこの新しいディレクトリに保存します。リソース ファイルの名前は、デフォルトのリソース ファイルと同じものにする必要があります。
次に、デフォルト リソースと代替リソースの例を示します。
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
hdpi
修飾子は、ディレクトリ内のリソースが高密度画面を持つ端末用であることを表します。これらのドローアブル ディレクトリの画像は特定の画面密度に合わせたサイズになっていますが、ファイル名は完全に同じになります。このように、icon.png
や background.png
画像を参照するのに使用するリソース ID は常に同じになりますが、Android はリソース ディレクトリ名の修飾子により端末設定情報を比較して、各リソースの現在の端末に最適なバージョンを選択します。
Android では複数の設定修飾子をサポートしており、それぞれの修飾子をダッシュで区切ることで、1 つのディレクトリ名に複数の修飾子を追加できます。表 2 には、有効な設定修飾子が優先度順に記載されています。参照ディレクトリに複数の修飾子を使用する場合、表に記載されている順番にディレクトリ名に追加する必要があります。
表 2. 設定修飾子の名前
設定 | 修飾子の値 | 説明 |
---|---|---|
MCC と MNC | 例: mcc310
mcc208-mnc00 など |
モバイル カントリー コード(MCC)です。端末の SIM カードにあるモバイル ネットワーク コード(MNC)が続くことがあります。たとえば、 端末が無線通信接続(GSM 電話)を使用する場合、MCC と MNC の値は SIM カードの値となります。 さらに、MCC のみを使用することもできます(たとえば、アプリに国固有の法に関するリソースを含める場合)。言語のみに基づいて指定する場合は、代わりに言語と地域の修飾子(次のセクションで解説)を使用します。MCC と MNC 修飾子を使用する場合は、慎重に設定し、予測のとおりに機能することをテストします。 さらに、設定フィールド |
言語と地域 | 例: en fr en-rUS fr-rFR fr-rCA b+en b+en+US b+es+419 |
言語は 2 文字の ISO 639-1 言語コードで定義し、オプションで、2 文字の ISO 3166-1-alpha-2 地域コードを後ろに追加します(前に小文字の「 コードでは大文字と小文字が区別されません。地域を区別するには、 Android 7.0(API レベル 24)では BCP 47 言語タグのサポートが導入されました。これを使用して、言語固有のリソースと地域固有のリソースを修飾できます。言語タグは、一連の 1 つ以上のサブタグで構成されています。各サブタグは、全体タグで識別される言語の範囲を絞り込むか制限します。言語タグの詳細については、言語を識別するためのタグをご覧ください。 BCP 47 言語タグを使用するには、
ユーザーがシステム設定で言語を変更すると、アプリの実行中にこの言語タグが変更されます。このことが実行時のアプリに与える影響については、実行時の変更の処理をご覧ください。 アプリを他の言語にローカライズするための詳細なガイドは、ローカライズをご覧ください。
|
レイアウトの方向 | ldrtl ldltr |
アプリのレイアウトの方向です。 この設定は、レイアウト、ドローアブル、値など、任意のリソースに適用できます。 たとえば、アラビア語になんらかの特定なレイアウトを提供し、その他の「右から左」の言語(ペルシャ語やヘブライ語など)に汎用的なレイアウトを提供する場合、次のように設定します。 res/ layout/ main.xml (Default layout) layout-ar/ main.xml (Specific layout for Arabic) layout-ldrtl/ main.xml (Any "right-to-left" language, except for Arabic, because the "ar" language qualifier has a higher precedence.) 注:アプリで右から左のレイアウト機能を有効にするには、 API レベル 17 で追加。 |
smallestWidth | sw<N>dp 例: sw320dp sw600dp sw720dp など |
使用可能な画面領域の最小寸法で指定する、画面の基本サイズ。具体的には、端末の smallestWidth は画面に使用できる高さと幅の最小サイズとなります(画面の「使用できる最小幅」と考えることもできます)。画面の現在の方向に関係なく、この修飾子を使用することで、アプリの UI 用に少なくとも
たとえば、画面領域のレイアウトの最小寸法を常に 600 dp にする必要がある場合、この修飾子を使用してレイアウト リソース 多くの場合、レイアウトの設計では幅が重要な要素になるため、smallestWidth を使用して一般的な画面サイズを決定することは有用です。多くの場合、UI は垂直にスクロールしますが、水平にスクロールする場合は、最小スペースの制約が厳しくなります。また、使用可能な幅は、ハンドセット用に 1 ペイン レイアウトを使用するか、またはタブレット用にマルチペイン レイアウトを使用するかを決定する際の重要な要素になります。したがって、各端末で使用できる最小幅を考慮することが最も重要になります。 端末の smallestWidth では画面の装飾とシステム UI が考慮されます。たとえば、端末の画面に smallestWidth の軸に沿ったスペースを考慮した固定 UI 要素がある場合、これらの画面ピクセルは UI に使用できないため、システムは実際の画面サイズよりも小さな smallestWidth を宣言します。 次に、一般的な画面サイズに使用する値を示します。
アプリで smallestWidth 修飾子の値が異なる複数のリソース ディレクトリを提供する場合、システムは端末の smallestWidth に最も近い(かつ超過しない)ものを使用します。 API レベル 13 で追加。 さらに、 さまざまな画面の設計とこの修飾子の使用方法の詳細については、複数画面をサポートするのデベロッパー ガイドをご覧ください。 |
使用可能な幅 | w<N>dp 例: w720dp w1024dp など |
リソースに使用する、使用可能な最小の画面幅を 多くの場合、この機能は、マルチペイン レイアウトを使用するかどうかを決定する際に有用です。タブレット端末の場合でも、横向きの画面で使用したマルチペイン レイアウトと同じレイアウトを縦向きの画面では使用したくない場合があるからです。したがって、画面サイズの修飾子と画面の向きの修飾子を併用する代わりに、この修飾子を使用して、レイアウトに必要な最小幅を指定することができます。 アプリでこの設定が異なる複数のリソース ディレクトリを提供する場合、システムは端末の現在の画面の幅に最も近い(かつ超過しない)ものを使用します。この値は画面の装飾を考慮します。つまり、端末のディスプレイの左や右になんらかの固定 UI 要素がある場合、これらの UI 要素を考慮し、アプリの使用可能なスペースを減らして、実際の画面サイズよりも小さな幅を使用します。 API レベル 13 で追加。 さらに、 さまざまな画面の設計とこの修飾子の使用方法の詳細については、複数画面をサポートするのデベロッパー ガイドをご覧ください。 |
使用可能な高さ | h<N>dp 例: h720dp h1024dp など |
リソースを使用する、使用可能な最小の画面の高さを「dp」単位で指定します。 画面サイズの修飾子と画面の向きの修飾子を使用する代わりに、 アプリでこの設定が異なる複数のリソース ディレクトリを提供する場合、システムは端末の現在の画面の高さに最も近い(かつ超過しない)ものを使用します。この値は画面の装飾を考慮します。つまり、端末のディスプレイの上や下になんらかの固定 UI 要素がある場合、これらの UI 要素を考慮し、アプリの使用可能なスペースを減らして、実際の画面サイズよりも小さな高さを使用します。固定されていない画面の装飾(全画面にした場合に非表示になる携帯電話のステータスバーなど)や、タイトルバーやアクションバーなどのウィンドウの装飾は、ここでは考慮されません。そのため、アプリでは指定したスペースよりもやや小さなサイズに対処できるように準備をしておく必要があります。 API レベル 13 で追加。 さらに、 さまざまな画面の設計とこの修飾子の使用方法の詳細については、複数画面をサポートするのデベロッパー ガイドをご覧ください。 |
画面サイズ |
small normal large xlarge
|
注:サイズ修飾子を持つ場合でも、リソースがそのサイズの画面以外には対応しないということではありません。現在の端末に最適な修飾子を持つ代替リソースを提供していない場合でも、システムによって最適なリソースが使用されることがあります。 注意:すべてのリソースが現在の画面よりも大きなサイズ修飾子を使用している場合、システムはそれらのリソースを使用せず、アプリは実行時にクラッシュしてしまいます(たとえば、すべてのレイアウト リソースに API レベル 4 で追加。 詳細については、複数画面をサポートするをご覧ください。 さらに、 |
画面アスペクト |
long notlong
|
API レベル 4 で追加。 これは純粋に画面のアスペクト比を基準とします(「長い」画面は幅広の画面になります)。これは画面の向きには関係ありません。 さらに、 |
円形の画面 |
round notround
|
API レベル 23 で追加。 さらに、 |
広色域 |
widecg nowidecg
|
API レベル 26 で追加。 さらに、 |
ハイ ダイナミック レンジ(HDR) |
highdr lowdr
|
API レベル 26 で追加。 さらに、 |
画面の向き |
port land
|
ユーザーが画面を回転すると、アプリの実行中にこの値が変更されます。実行時のアプリに与える影響については、実行時の変更の処理をご覧ください。 さらに、 |
UI モード |
car desk television appliance watch vrheadset
|
API レベル 8 で追加。television は API 13 で追加。watch は API 20 で追加。 端末をホルダーに装着したり、取り外したりしたときのアプリの反応については、装着状態とホルダータイプを特定および監視するをご覧ください。 ユーザーが端末をホルダーに装着すると、アプリの実行中にこの値が変更されます。 |
ナイトモード |
night notnight
|
API レベル 8 で追加。 ナイトモードを自動モード(デフォルト)のままにしておくと、時間を基準にしてモードが変更された場合に、アプリの実行中にこの値が変更されます。 |
画面ピクセル密度(dpi) |
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi nnndpi
|
6 つのプライマリ密度のサイズの比率は 3:4:6:8:12:16 です(tvdpi 密度を除く)。そのため、ldpi では 9x9 のビットマップ、mdpi では 12x12 のビットマップ、hdpi では 18x18 のビットマップ、xhdpi では 24x24 のビットマップとなります。 画像リソースがテレビや他の特定の端末で正常に表示されず、tvdpi リソースを試す場合、スケーリング係数は 1.33* mdpi になります。たとえば、密度が mdpi の画面用の 100px x 100px 画像は、tvdpi 用にすると 133px x 133px になります。 注:密度修飾子を持つ場合でも、リソースがその密度の画面以外には対応しないということではありません。現在の端末に最適な修飾子を持つ代替リソースを提供していない場合でも、システムによって最適なリソースが使用されることがあります。 異なる画面密度を処理する方法や、Android が現在の密度に合わせてビットマップのサイズを変更する方法については、複数画面をサポートするをご覧ください。 |
タッチスクリーン タイプ |
notouch finger
|
|
キーボードの使用可能状況 |
keysexposed keyshidden keyssoft
|
ユーザーがハードウェア キーボードを開くと、アプリの実行中にこの値が変更されます。実行時のアプリに与える影響については、実行時の変更の処理をご覧ください。 さらに、設定フィールド |
主なテキストの入力方法 |
nokeys qwerty 12key
|
さらに、 |
ナビゲーション キーの使用可否 |
navexposed navhidden
|
ユーザーがナビゲーション キーを表示させると、アプリの実行中にこの値が変更されます。実行時のアプリに与える影響については、実行時の変更の処理をご覧ください。 さらに、 |
タップ以外の主なナビゲーション方法 |
nonav dpad trackball wheel
|
|
プラットフォーム バージョン(API レベル) | 例: v3 v4 v7 など |
端末がサポートする API レベル。たとえば、 |
注:Android 1.0 以降、いくつかの設定修飾子が追加されているため、すべてのバージョンの Android がすべての修飾子をサポートしているわけではありません。新しい修飾子を使用すると、旧式の端末がその修飾子を無視できるように、プラットフォーム バージョンの修飾子が暗黙的に追加されます。たとえば、available-width の修飾子は API レベル 13 で新たに追加されたため、w600dp
修飾子を使用すると、自動的に v13
修飾子が追加されます。問題を回避するために、常に一連のデフォルト リソースを含めるようにします(修飾子のない一連のリソース)。詳細については、リソースとの最適な端末の互換性を提供するセクションをご覧ください。
修飾子の名前のルール
ここでは、設定修飾子の名前の使用方法に関するルールを説明します。
- リソースの 1 つのセットに複数の修飾子を指定できます。その場合は、ダッシュで区切ります。たとえば、
drawable-en-rUS-land
は画面が横向きの米国英語の端末に適用されます。 - 修飾子は、次のように表 2 の順番で使用します。
- 誤:
drawable-hdpi-port/
- 正:
drawable-port-hdpi/
- 誤:
- 代替リソースのディレクトリはネストできません。
res/drawable/drawable-en/
などは使用できません。 - 値は大文字と小文字を区別しません。大文字と小文字を区別しないファイル システムの問題を回避するために、処理前にリソース コンパイラがディレクトリ名を小文字に変換します。読みやすくする場合にのみ、名前に大文字を使用します。
- それぞれの修飾子タイプに使用できる値は 1 つだけです。たとえば、スペインとフランスの両方に同じドローアブル ファイルを使用する場合も、ディレクトリ名を
drawable-rES-rFR/
とすることはできません。代わりに、該当するファイルを含むdrawable-rES/
とdrawable-rFR/
という名前の 2 つのリソース ディレクトリが必要になります。ただし、実際には、両方の場所で同じファイルを重複させる必要はありません。代わりに、リソースのエイリアスを作成できます。後述のエイリアス リソースを作成するをご覧ください。
これらの修飾子を名前に持つディレクトリに代替リソースを保存すると、現在の端末設定に基づいて、Android がアプリにリソースを自動的に適用します。リソースが要求されるたびに、Android は要求されたリソース ファイルを持つ代替リソース ディレクトリを探し、最適なリソースを見つけます(後述)。特定の端末設定に合う代替リソースがない場合、Android は対応するデフォルト リソース(設定修飾子を含まない特定のリソースタイプ用の一連のリソース)を使用します。
エイリアス リソースを作成する
複数の端末設定で使用するリソースがある場合(ただし、デフォルト リソースとして提供しない場合)、同じリソースを複数の代替リソース ディレクトリに配置する必要はありません。その代わりに、(場合によっては)デフォルト リソースのディレクトリに保存したリソースのエイリアスとして機能する代替リソースを作成できます。
注:すべてのリソースに、別のリソースのエイリアスを作成できるメカニズムが備わっているわけではありません。特に、アニメーション、メニュー、未加工リソース、その他 xml/
ディレクトリにある未指定のリソースは、この機能に対応していません。
例として、アプリアイコン icon.png
について、ロケールごとに一意のバージョンが必要な状況を考えてみましょう。ただし、英語カナダとフランス語カナダの 2 つのロケールでは同じバージョンを使用する必要があります。英語カナダとフランス語カナダの両方のリソース ディレクトリに同じ画像をコピーする必要は実際にはありません。代わりに、両方に使用する画像を icon_ca.png
という名前(icon.png
以外の名前)で保存し、デフォルトの res/drawable/
ディレクトリに格納します。次に <bitmap>
要素を使用して icon_ca.png
リソースを参照する icon.xml
ファイルを res/drawable-en-rCA/
と res/drawable-fr-rCA/
に作成します。これにより、PNG ファイルを 1 つだけ作成し、それを指す小さな XML ファイルを 2 つ作成するだけで済みます(次に、XML ファイルの例を示します)。
ドローアブル
既存のドローアブルのエイリアスを作成するには、<drawable>
要素を使用します。次に例を示します。
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
このファイルを drawables.xml
として(res/values-en-rCA/
などの代替リソース ディレクトリに)保存すると、R.drawable.icon
として参照可能なリソースにコンパイルされますが、実際のところ、これは(res/drawable/
に保存されている)R.drawable.icon_ca
リソースのエイリアスです。
レイアウト
既存のレイアウトのエイリアスを作成するには、<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 を新しい文字列の値として使用します。次に例を示します。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
R.string.hi
リソースは R.string.hello
のエイリアスになりました。
その他の単純な値も同様に機能します。次に色の例を示します。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
アプリリソースにアクセスする
アプリでリソースを提供すると、そのリソース ID を参照することによってリソースを適用できます。リソース ID はすべてプロジェクトの R
クラスで定義します。これは aapt
ツールが自動的に生成します。
アプリをコンパイルすると、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.hello
string
はリソースタイプ、hello
はリソース名です。多くの Android API が、リソース ID をこの形式で指定してリソースにアクセスします。コードでリソースにアクセスするをご覧ください。 - XML 内:
R
クラスで定義されたリソース ID に対応する、次のような特殊な XML 構文を使用します。@string/hello
string
はリソースタイプ、hello
はリソース名です。この構文は、リソースで提供する値が想定される、XML リソース内の任意の場所に使用できます。XML からリソースにアクセスするをご覧ください。
コードでリソースにアクセスする
リソース ID をメソッド パラメータとして渡すことで、コード内でリソースを使用できます。たとえば、setImageResource()
を使って、ImageView
が res/drawable/myimage.png
リソースを使用するように設定できます。
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);
注意: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
タイプは除外できます。
元のファイルにアクセスする
一般的な操作ではありませんが、元のファイルやディレクトリへのアクセスが必要になることがあります。その場合、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 でアプリを実行するときにデフォルト リソースが提供されていないと、古いバージョンの Android では新しい修飾子の付いたリソースを使用できないために、アプリがクラッシュします。たとえば、minSdkVersion
が 4 に設定されている場合に、ナイトモード(API レベル 8 で追加された night
や notnight
)を使用してすべてのドローアブル リソースの修飾子を設定すると、API レベル 4 の端末はドローアブル リソースにアクセスできず、クラッシュします。この場合、notnight
をデフォルト リソースにしたいのであれば、この修飾子を除外します。よって、ドローアブル リソースは drawable/
または drawable-night/
に格納します。
そこで、端末の最適な互換性を提供するには、アプリを適切に実行するのに必要なリソースに常にデフォルト リソースを提供するようにします。次に、設定修飾子を使用して、特定の端末設定向けの代替リソースを作成します。
このルールには次の例外があります。アプリの minSdkVersion
が 4 以上の場合、画像密度修飾子で代替のドローアブル リソースを提供するときには、デフォルトのドローアブル リソースは必要ありません。デフォルトのドローアブル リソースがない場合でも、Android は代替の画面密度の中で最適なものを見つけて、必要に応じてビットマップのサイズを変更できます。ただし、すべてのタイプに最適な操作性を提供するには、密度の 3 つのタイプすべてに代替ドローアブルを提供する必要があります。
Android が最適なリソースを見つける仕組み
代替を提供するリソースを要求すると、現在の端末設定に応じて Android が実行時に使用する代替リソースを選択します。Android が代替リソースを選択する方法説明するために、次のドローアブル ディレクトリを想定します。それぞれに同じ画像の異なるバージョンが入っています。
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
さらに、次のような端末設定を想定します。
ロケール = en-GB
画面の向き = port
画面ピクセル密度 = hdpi
タッチスクリーン タイプ = notouch
主なテキストの入力方法 = 12key
端末設定と使用可能な代替リソースを比較して、Android は drawable-en-port
からドローアブルを選択します。
システムは、次のロジックを使用して、使用するリソースを決定します。

図 2. Android が最適なリソースを見つける仕組みを示したフローチャート
- 端末設定に矛盾するリソース ファイルを排除します。
en-GB
ロケールに矛盾するため、drawable-fr-rCA/
ディレクトリが排除されます。drawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/例外: 画面ピクセル密度は、矛盾により排除されない修飾子の 1 つです。それぞれの画面密度はその時点で最適であると判断されたものであるため、端末の画面密度が hdpi の場合でも、
drawable-port-ldpi/
は排除されません。詳細については、複数画面をサポートするのドキュメントをご覧ください。 - リスト(表 2)にある(次に)優先される修飾子を選択します(MCC から順に下がっていきます)。
- この修飾子を含むリソース ディレクトリがあるかどうかを確認します。
- ない場合は、ステップ 2 に戻り、次の修飾子を調べます(この例では、言語修飾子になるまですべて「いいえ」になります)。
- 「はい」の場合は、ステップ 4 に進みます。
- この修飾子を含まないリソース ディレクトリを排除します。この例では、システムによって言語修飾子を含まないすべてのディレクトリが排除されます。
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/例外: 対象となる修飾子が画面ピクセル密度の場合、Android は端末の画面密度に最も近いオプションを選択します。一般的に、Android では小さな元画像を拡大するよりも、大きな元画像を縮小する方法が使用されます。複数画面をサポートするをご覧ください。
- 残るディレクトリが 1 つになるまで、元に戻ってステップ 2、3、4 を繰り返します。この例では、次にマッチングするのが画面の向きの修飾子です。そのため、画面の向きを指定しないリソースは排除されます。
drawable-en/drawable-en-port/drawable-en-notouch-12key/drawable-en-port
ディレクトリが残ります。
この手順は要求した各リソースに対して実行されますが、システムはさらにいくつかの最適化を行います。たとえば、端末の設定が判明すると、マッチングしない代替リソースが排除されたりします。たとえば、設定言語が英語(「en」)の場合、言語修飾子が英語以外に設定されているリソース ディレクトリはチェック対象のリソースのプールに入ることはありません(言語修飾子のないリソース ディレクトリはそのままプールに入ります)。
画面サイズ修飾子に基づいてリソースを選択する場合に、最適なリソースがない場合、システムは現在の画面よりも小さな画面向けのリソースを使用します(たとえば、必要に応じて大きなサイズの画面が通常サイズの画面のリソースを使用します)。ただし、使用できるリソースが現在の画面用のリソースよりも大きなものしかない場合は、システムはそれらのリソースを使用しません。よって、その他のリソースが端末設定に一致しないときはアプリがクラッシュします(たとえば、すべてのレイアウト リソースに xlarge
修飾子のタグが付いているが、端末は normal(通常)サイズの画面である場合)。
注:修飾子の優先度が高い(表 2 で上位にある)方が、端末に正確に一致する修飾子の数よりも重要になります。たとえば、前述のステップ 4 では、drawable-en
には一致するパラメータが 1 つしかありませんが(言語)、リストの最後の選択肢には、端末に正確に一致する修飾子が 3 つあります(画面の向き、タッチスクリーン タイプ、入力方法)。ただし、言語はこれらの他の修飾子よりも優先されるため、drawable-port-notouch-12key
は排除されます。