代替リソース

代替リソースとは、特定のデバイスまたは、現在の言語、特定の画面サイズ、ピクセル密度などの実行時の構成を対象とするリソースです。 Android で、既定のリソースよりも特定のデバイスまたは構成に固有のリソースと一致する場合は、そのリソースが代わりに使用されます。 現在の構成に一致する代替リソースが見つからない場合は、既定のリソースが読み込まれます。 アプリケーションで使用されるリソースを Android で決定する方法については、以下のリソースの場所に関するセクションで詳しく説明します

代替リソースは、リソースの種類に応じて Resources フォルダー内のサブディレクトリとして、既定のリソースと同様に編成されます。 代替リソースのサブディレクトリの名前は、ResourceType-Qualifier の形式です

Qualifier は、特定のデバイス構成を識別する名前です。 名前に複数の修飾子が含まれる場合があり、それぞれダッシュで区切って指定できます。 たとえば、次のスクリーンショットは、ロケール、画面密度、画面サイズ、向きなど、さまざまな構成の代替リソースを含む単純なプロジェクトを示しています。

リソースの種類に修飾子を追加する場合は、次の規則が適用されます。

  1. 複数の修飾子がある場合は、各修飾子をダッシュで区切って指定できます。

  2. 修飾子は 1 回だけ指定できます。

  3. 修飾子は、次の表に示す順序で指定する必要があります。

使用可能な修飾子を以下に示します。

  • MCC と MNCモバイルの国コード (MCC) と必要に応じてモバイル ネットワーク コード (MNC)。 SIM カードは MCC を提供し、デバイスが接続されているネットワークは MNC を提供します。 モバイルの国コードを使用してロケールをターゲットにすることはできますが、以下で指定する言語修飾子を使用することをお勧めします。 たとえば、リソースのターゲットをドイツにするには、修飾子は mcc262 になります。 米国の T-Mobile のリソースをターゲットにするには、修飾子は mcc310-mnc026 になります。 モバイルの国コードとモバイル ネットワーク コードの完全な一覧については、http://mcc-mnc.com/ を参照してください。

  • 言語 – 2 文字の ISO 639-1 言語コードと、必要に応じて 2 文字の ISO-3166-alpha-2 地域コードが続きます。 両方の修飾子が指定されている場合は、-r で区切ります。 たとえば、フランス語のロケールをターゲットにするには、fr の修飾子が使用されます。 フランス語 (カナダ) ロケールをターゲットにするには、fr-rCA が使用されます。 言語コードと地域コードの完全な一覧については、言語の名前を表すコード国名とコード要素のページを参照してください。

  • 最小幅 – アプリケーションを実行する最小の画面幅を指定します。 「さまざまな画面のリソース作成」で詳しく説明します。 API レベル 13 (Android 3.2) 以降で使用できます。 たとえば、修飾子 sw320dp は、高さと幅が 320dp 以上のデバイスをターゲットにするために使用されます。

  • 使用可能な幅 – wNdp 形式の画面の最小幅。N は密度に依存しないピクセルの幅です。 ユーザーがデバイスを回転すると、この値が変更される可能性があります。 「さまざまな画面のリソース作成」で詳しく説明します。 API レベル 13 (Android 3.2) 以降で使用できます。 例: 修飾子 w720dp は、幅が 720dp 以上のデバイスをターゲットにするために使用されます。

  • 使用可能な高さ – hNdp 形式の画面の最小の高さ。N は dp 単位の高さです。 ユーザーがデバイスを回転すると、この値が変更される可能性があります。 「さまざまな画面のリソース作成」で詳しく説明します。 API レベル 13 (Android 3.2) 以降で使用できます。 たとえば、修飾子 h720dp は、高さが 720dp 以上のデバイスをターゲットにするために使用されます

  • 画面サイズ – この修飾子は、これらのリソースの対象となる画面サイズの一般化です。 「さまざまな画面のリソース作成」で詳しく説明します。 指定できる値は、smallnormallarge、および xlarge です。 API レベル 9 (Android 2.3/Android 2.3.1/Android 2.3.2) で追加されました

  • 画面の縦横比 – これは、画面の向きではなく、縦横比に基づいています。 長い画面は幅が広くなります。 API レベル 4 (Android 1.6) で追加されました。 指定できる値は long と notlong です。

  • 画面の向き – 縦または横の画面の向き。 これは、アプリケーションの有効期間中に変更される可能性があります。 設定可能な値は port および land です。

  • ドック モード – 自動車ドックまたはデスク ドック内のデバイス用。 API レベル 8 (Android 2.2.x) で追加されました。 設定可能な値は car および desk です。

  • ナイト モード – アプリケーションが夜間または日中に実行されているかどうか。 これは、アプリケーションの有効期間中に変更される可能性があり、開発者が夜間に暗いバージョンのインターフェイスを使用する機会を提供することを目的としています。 API レベル 8 (Android 2.2.x) で追加されました。 設定可能な値は night および notnight です。

  • 画面のピクセル密度 (dpi) – 物理画面上の特定の領域のピクセル数。 通常、1 インチあたりのドット数 (dpi) で表されます。 次のいずれかの値になります。

    • ldpi – 低密度画面。

    • mdpi – 中密度画面

    • hdpi – 高密度画面

    • xhdpi – 超高密度画面

    • nodpi – スケーリングされないリソース

    • tvdpi – mdpi と hdpi の間の画面向けに API レベル 13 (Android 3.2) で導入されました。

  • タッチスクリーンの種類 – デバイスが持っている可能性のあるタッチスクリーンの種類を指定します。 使用可能な値は notouch (タッチスクリーンなし)、stylus (スタイラスに適した抵抗型タッチスクリーン)、および finger (タッチスクリーン) です。

  • キーボードの可用性 – 使用できるキーボードの種類を指定します。 これは、ユーザーがハードウェア キーボードを開いた場合など、アプリケーションの有効期間中に変更される可能性があります。 次のいずれかの値になります。

    • keysexposed – デバイスでキーボードが使用可能です。 ソフトウェア キーボードが有効になっていない場合、これはハードウェア キーボードが開いているときにのみ使用されます。

    • keyshidden – デバイスにはハードウェア キーボードがありますが隠されており、ソフトウェア キーボードは有効になっていません。

    • keyssoft – デバイスでソフトウェア キーボードが有効になっています。

  • プライマリ テキストの入力方法 – 入力に使用できるハードウェア キーの種類を指定するために使用します。 次のいずれかの値になります。

    • nokeys – 入力用のハードウェア キーはありません。

    • qwerty – 利用可能な qwerty キーボードがあります。

    • 12key – 12 キーのハードウェア キーボードがあります

  • ナビゲーション キーの可用性 – 5 方向または d パッド (方向パッド) ナビゲーションが使用可能な場合。 これは、アプリケーションの有効期間中に変更される可能性があります。 次のいずれかの値になります。

    • navexposed – ユーザーはナビゲーション キーを使用できます

    • navhidden – ナビゲーション キーは使用できません。

  • 主要な非タッチ ナビゲーション方法 – デバイスで使用できるナビゲーションの種類。 次のいずれかの値になります。

    • nonav – 利用可能な唯一のナビゲーション機能は、タッチ スクリーンです

    • dpad – ナビゲーションに d パッド (方向パッド) を使用できます

    • trackball – デバイスにナビゲーション用のトラックボールがあります

    • wheel – 1 つ以上の方向ホイールが使用可能な一般的でないシナリオ

  • プラットフォーム バージョン (API レベル) – vN 形式の、デバイスでサポートされる API レベル。N は対象となる API レベルです。 たとえば、v11 は API レベル 11 (Android 3.0) デバイスを対象とします。

リソース修飾子の詳細については、Android 開発者向け Web サイトでリソースの提供の説明を参照してください。

Android で使用するリソースを決定する方法

Android アプリケーションに多くのリソースが含まれる可能性は非常に高く、よく起こり得ることです。 デバイス上でアプリケーションが実行されるときに、Android がどのようにアプリケーションのリソースを選択するかを理解することが重要です。

Android では、次のルールのテストを繰り返してリソース ベースを決定します。

  • 矛盾する修飾子を排除する – たとえば、デバイスの向きが縦向きの場合、すべての横向きリソース ディレクトリが拒否されます。

  • サポートされていない修飾子を無視する – すべての API レベルですべての修飾子を使用できるわけではありません。 リソース ディレクトリに、デバイスでサポートされていない修飾子が含まれている場合、そのリソース ディレクトリは無視されます。

  • 次に優先順位の高い修飾子を特定する – 前述の表を参照して、次に優先順位の高い修飾子を選択します (上から下)。

  • 修飾子のリソース ディレクトリを保持する – 前述の表に修飾子が一致するリソース ディレクトリがある場合は、次に優先順位が高い修飾子を選択します (上から下)。

これらの規則を、次のフローチャートにも示します。

Resources flowchart

システムが密度固有のリソースを探していて見つからない場合は、他の密度固有のリソースを見つけてスケーリングしようとします。 Android では、必ずしも既定のリソースが使用されるとは限りません。 たとえば、低密度のリソースを探していて使用できない場合、Android は既定または中密度のリソースよりも高密度バージョンのリソースを選択する場合があります。 これは、高密度リソースを 0.5 の係数でスケールダウンできるためです。これにより、0.75 の係数を必要とする中密度リソースをスケールダウンするよりも可視性の問題が少なくなります。

たとえば、次のドローアブル リソース ディレクトリを持つアプリケーションを考えてみましょう。

drawable
drawable-en
drawable-fr-rCA
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key

これで、次の構成でデバイス上でアプリケーションが実行されます。

  • ロケール – en-GB
  • 向き – port
  • 画面密度 – hdpi
  • タッチスクリーンの種類 – notouch
  • プライマリ入力方法 – 12key

まず、フランス語のリソースは、en-GB のロケールと競合するため排除され、次の結果が残ります。

drawable
drawable-en
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key

次に、前述の修飾子テーブル (MCC と MNC) から最初の修飾子が選択されます。 この修飾子を含むリソース ディレクトリがないため、MCC/MNC コードは無視されます。

次の修飾子 (言語) が選択されます。 言語コードに一致するリソースがあります。 言語コード en と一致しないすべてのリソース ディレクトリは拒否されるため、リソースの一覧は次のようになります。

drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi

表示されている次の修飾子は画面の向きを示しているため、画面の向き port と一致しないすべてのリソース ディレクトリは除外されます。

drawable-en-port
drawable-en-port-ldpi

次は、画面密度の修飾子 ldpi です。その結果、もう 1 つのリソース ディレクトリが除外されます。

drawable-en-port-ldpi

このプロセスの結果として、Android はデバイスのリソース ディレクトリ drawable-en-port-ldpi 内のドローアブル リソースを使用します。

Note

画面サイズ修飾子は、この選択プロセスに例外を 1 つ提供します。 Android では、現在のデバイスが提供する画面よりも小さい画面用に設計されたリソースを選択できます。 たとえば、大画面デバイスでは、通常のサイズの画面に提供されるリソースを使用できます。 ただし、この逆は当てはまりません。同じ大画面デバイスでは、特大の画面に提供されているリソースは使用されません。 Android で特定の画面サイズに一致するリソース セットが見つからない場合、アプリケーションがクラッシュします。