アプリのリソースを追加する

ビットマップやレイアウトなどのアプリリソースは、各モジュールの res/ ディレクトリ内にあるタイプ別のディレクトリに配置されます。各リソース ファイルについて、異なるデバイス構成用に最適化した代替バージョン(高密度画面向けの高解像度バージョンのビットマップなど)を追加することもできます。

Android Studio では、追加するリソースのタイプに応じて、さまざまな方法で新しいリソースと代替リソースを追加できます。このページでは、基本的なリソース ファイルの追加方法、リソースの場所の変更方法、リソースのマージの仕組みについて説明します。

特定のリソースタイプを作成する方法については、以下のページをご覧ください。

アプリコードからリソースを参照する方法については、アプリのリソースの概要をご覧ください。

XML リソース ファイルを追加する

上記のリンク先のページでは、リソースタイプごとにカスタマイズされたワークフローについて説明していますが、次の手順に沿って、任意のタイプの XML リソース ファイルを追加することもできます。

  1. [Project] ウィンドウ([Android] ビューまたは [Project] ビュー)で、対象アプリ モジュールをクリックします。

  2. [File] > [New] > [Android resource file] を選択します。

    図 1. [New Resource File] ダイアログ

  3. ダイアログに詳細を入力します。
    • File name: XML ファイルの名前を入力します(.xml という接尾辞は不要です)。
    • Resource type: 作成するリソースのタイプを選択します。
    • Root element: 必要に応じて、ファイルのルート XML 要素を選択します。一部のリソースタイプにはサポートするルート要素のタイプが 1 つしかないため、選択したリソースタイプによっては、この項目を編集できない場合があります。
    • Source set: ファイルを保存するソースセットを選択します。
    • Directory name: ディレクトリには、リソースタイプと構成修飾子において固有の名前を付ける必要があります。手動でディレクトリ名に構成修飾子を追加する場合を除き、この項目は編集しないでください(代わりに、[Available qualifiers] で構成修飾子を追加できます)。
    • Available qualifiers: 構成修飾子を手動でディレクトリ名に含める代わりに、このリストから修飾子を選択して追加アイコン をクリックすることで指定できます。
  4. 必要な修飾子をすべて追加したら、[OK] をクリックします。

ヒント: 追加するリソースタイプに固有の [New Resource File] ダイアログの簡易バージョンを開くには、res フォルダにある既存のリソース ディレクトリを右クリックして、[New] > [type-name resource file] を選択します。

複雑な XML リソースをインライン化する

一部の複雑なリソースには、複数の XML リソース ファイルが必要です。たとえば、アニメーション化されたベクター型ドローアブルには、ベクター型ドローアブル オブジェクトとアニメーション オブジェクトが 1 つずつ含まれるため、XML ファイルが少なくとも 3 つ必要です。

この例では、XML ファイルを再利用する必要がある場合に、別々の XML ファイルを作成して保持できます。ただし、XML ファイルがこのアニメーション化されたベクター型ドローアブル専用である場合は、代わりに Android Asset Packaging Tool(AAPT)のインライン リソース形式を使用できます。AAPT を使用すると、1 つの XML ファイルで 3 つのすべてのリソースを定義できます。詳細については、複雑な XML リソースをインライン化するをご覧ください。

リソース ディレクトリを追加する

新しいリソース ディレクトリを追加する手順は次のとおりです。

  1. [Project] ウィンドウで、対象のアプリ モジュールをクリックします。

  2. [File] > [New] > [Android resource directory] を選択します。

    図 2. [New Resource Directory] ダイアログ

  3. ダイアログに詳細を入力します。
    • Directory name: ディレクトリには、リソースタイプと構成修飾子の組み合わせにおいて固有の名前を付ける必要があります。手動でディレクトリ名に構成修飾子を追加する場合を除き、この項目は編集しないでください(代わりに、[Available qualifiers] で構成修飾子を追加できます)。
    • Resource type: ディレクトリに含めるリソースタイプを選択します。
    • Source set: そのディレクトリが必要なソースセットを選択します。
    • Available qualifiers: 構成修飾子を手動でディレクトリ名に含める代わりに、このリストから修飾子を選択して追加アイコン をクリックすることで指定できます。
  4. 必要な修飾子をすべて追加したら、[OK] をクリックします。

リソース ディレクトリを変更する

デフォルトでは、リソースは module-name/src/source-set-name/res/ にあります。 たとえば、モジュールのメイン ソースセットのリソースは src/main/res/ にあり、デバッグ ソースセットのリソースは src/debug/res/ にあります。

ただし、sourceSets ブロックの res.srcDirs プロパティを使用して、これらのパスを任意の場所(build.gradle ファイルからの相対パス)に変更できます。次に例を示します。

Groovy

android {
    sourceSets {
        main {
            res.srcDirs = ['resources/main']
        }
        debug {
            res.srcDirs = ['resources/debug']
        }
    }
}

Kotlin

android {
    sourceSets {
        getByName("main") {
            res.srcDirs("resources/main")
        }
        getByName("debug") {
            res.srcDirs("resources/debug")
        }
    }
}

1 つのソースセットに複数のリソース ディレクトリを指定することもできます。その場合、それらのリソース ディレクトリはビルドツールによってマージされます。次に例を示します。

Groovy

android {
    sourceSets {
        main {
            res.srcDirs = ['res1', 'res2']
        }
    }
}

Kotlin

android {
    sourceSets {
        main {
            res.srcDirs("res1", "res2")
        }
    }
}

詳細については、ソースセットをご覧ください。

リソースをマージする

最終的なアプリファイルのリソースは、次の 3 つのソースから取得されます。

  • メイン ソースセット(通常は src/main/res/ にあります)
  • ビルド バリアント ソースセット
  • Android ライブラリ(AAR)

各ソースセットまたはライブラリのすべてのリソースが一意である場合、それらはすべて最終的なアプリに追加されます。リソースは、ファイル名がリソースタイプ ディレクトリとリソース修飾子(定義されている場合)の両方で一意である場合、一意と見なされます。

同じリソースに一致するバージョンが複数ある場合、1 つのバージョンのみが最終的なアプリに含まれます。ビルドツールで、次の優先順位(左ほど高い)に基づいて保持するバージョンが選択されます。

ビルド バリアント > ビルドタイプ > プロダクト フレーバー > メイン ソースセット > ライブラリ依存関係

たとえば、メイン ソースセットに以下が含まれており、

  • res/layout/example.xml
  • res/layout-land/example.xml

デバッグ ビルドタイプに以下が含まれているとします。

  • res/layout/example.xml

この場合、最終的なアプリには、デバッグ ビルドタイプからの res/layout/example.xml と、メイン ソースセットからの res/layout-land/example.xml が組み込まれます。

ただし、ビルド構成で特定のソースセットに対して複数のリソース フォルダが指定されており、それらのソース間に競合がある場合は、各リソース ディレクトリの優先度が同じであるため、エラーが発生してマージが失敗します。