これは、が取得される前にリソース マージが発生する必要があるためです。TypedArray
Gradle ベースのビルド システムは、リソースの新しいマージ メカニズムを使用します。以前のビルド システムでは、マージは、オーバーレイとして機能する aapt にリソース フォルダーのリストを渡すことで行われ、オーバーレイ内の新しいリソースが自動的に追加されるように --auto-add-overlay が指定されていました (デフォルトの動作はオーバーレイの場合です)。既存のリソースのみをオーバーライドし、新しいリソースを作成しない)。
Gradle ベースのビルド システムの目標の 1 つは、より高い柔軟性を提供することでした。また、よく寄せられる機能要求の 1 つは、複数のリソース フォルダーを持つ機能でした。aapt はこれを処理できないため、新しいビルド システムは aapt の前に実行される新しいマージ メカニズムを導入し、aapt に供給される単一のマージされたリソース フォルダーを生成します。このマージには、Gradle の入力/出力変更検出と実装方法の両方で、インクリメンタルであるという利点があります (つまり、単一のファイルに変更を適用するだけでマージを再実行できます)。
マージされたリソースは、3 種類のソースから取得されます。
- 主な sourceSet に関連付けられた主なリソースは、通常 src/main/res にあります。
- ビルド タイプとフレーバーに由来するバリアント オーバーレイ。
- aar バンドルの res エントリを通じてリソースを提供するライブラリ プロジェクトの依存関係。
たとえば、異なるものを使用する場合productFlavors、またはbuildTypesフレーバーごとに異なるリソースを使用する場合があります。そのため、開発時に最初に設定したものと、実際にフレーバーを変更した後に提供されるものは異なる場合があります。