Übersicht über App-Ressourcen (Ansichten)

Konzepte und Jetpack Compose-Implementierung

Ressourcen sind die zusätzlichen Dateien und statischen Inhalte, die von Ihrem Code verwendet werden, z. B. Bitmaps, Layoutdefinitionen, Strings für die Benutzeroberfläche und Animationsanweisungen.

Lagern Sie App-Ressourcen wie Bilder und Strings immer aus Ihrem Code aus, damit Sie sie unabhängig verwalten können. Außerdem können Sie alternative Ressourcen für bestimmte Gerätekonfigurationen bereitstellen, indem Sie sie in speziell benannten Ressourcenverzeichnissen gruppieren. Zur Laufzeit verwendet Android die entsprechende Ressource basierend auf der aktuellen Konfiguration. Beispielsweise möchten Sie je nach Bildschirmgröße ein anderes UI-Layout oder je nach Spracheinstellung andere Strings bereitstellen.

Sobald Sie Ihre App-Ressourcen externalisiert haben, können Sie über Ressourcen-IDs darauf zugreifen, die in der Klasse R Ihres Projekts generiert werden. In diesem Dokument wird beschrieben, wie Sie die Ressourcen in Ihrem Android-Projekt gruppieren. Außerdem erfahren Sie, wie Sie alternative Ressourcen für bestimmte Gerätekonfigurationen bereitstellen und dann über Ihren App-Code oder andere XML-Dateien darauf zugreifen.

Ressourcentypen gruppieren

Platzieren Sie jeden Ressourcentyp in einem bestimmten Unterverzeichnis des res/-Verzeichnisses Ihres Projekts. Hier sehen Sie beispielsweise die Dateihierarchie für ein einfaches Projekt:

MyProject/
    src/
        MyActivity.java
    res/
        drawable/
            graphic.png
        layout/
            main.xml
            info.xml
        mipmap/
            icon.png
        values/
            strings.xml

Das Verzeichnis res/ enthält alle Ressourcen in seinen Unterverzeichnissen: eine Bildressource, zwei Layoutressourcen, ein mipmap/-Verzeichnis für Launcher-Symbole und eine String-Ressourcendatei. Die Namen der Ressourcenverzeichnisse sind wichtig und werden in Tabelle 1 beschrieben.

Tabelle 1: Im Projektverzeichnis res/ werden folgende Ressourcenverzeichnisse unterstützt.

Verzeichnis

Ressourcentyp

animator/

XML-Dateien, in denen Eigenschaftsanimationen definiert sind.

anim/

XML-Dateien, in denen Tween-Animationen definiert werden. Property-Animationen können auch in diesem Verzeichnis gespeichert werden. Das Verzeichnis animator/ wird jedoch für Property-Animationen bevorzugt, um zwischen den beiden Typen zu unterscheiden.

color/

XML-Dateien, die eine Zustandsliste von Farben definieren. Weitere Informationen finden Sie unter Ressource für Farbstatusliste.

drawable/

Bitmap-Dateien (PNG, .9.png, JPG oder GIF) oder XML-Dateien, die in die folgenden untergeordneten zeichenfähigen Ressourcentypen kompiliert werden:

  • Bitmap-Dateien
  • Nine-Patches (Bitmaps, die in der Größe angepasst werden können)
  • Bundesstaatenlisten
  • Formen
  • Drawable-Animationen
  • Andere Drawables

Weitere Informationen finden Sie unter Drawable-Ressourcen.

mipmap/

Drawable-Dateien für verschiedene Launcher-Symbol-Dichten. Weitere Informationen zum Verwalten von Launcher-Symbolen mit mipmap/-Ordnern finden Sie unter App-Symbole in mipmap-Verzeichnisse einfügen.

layout/

XML-Dateien, die ein Layout für die Benutzeroberfläche definieren. Weitere Informationen finden Sie unter Layout-Ressource.

menu/

XML-Dateien, in denen App-Menüs wie ein Optionsmenü, ein Kontextmenü oder ein Untermenü definiert werden. Weitere Informationen finden Sie unter Menüressource.

raw/

Beliebige Dateien, die im Rohformat gespeichert werden sollen. Wenn Sie diese Ressourcen mit einem Roh-InputStream öffnen möchten, rufen Sie Resources.openRawResource mit der Ressourcen-ID auf, die R.raw.filename ist.

Wenn Sie jedoch Zugriff auf die ursprünglichen Dateinamen und die Dateihierarchie benötigen, sollten Sie Ressourcen im Verzeichnis assets/ anstelle von res/raw/ speichern. Dateien in assets/ erhalten keine Ressourcen-ID, sodass Sie sie nur mit AssetManager lesen können.

values/

XML-Dateien, die einfache Werte wie Strings, Ganzzahlen und Farben enthalten.

Während in XML-Ressourcendateien in anderen res/-Unterverzeichnissen eine einzelne Ressource basierend auf dem XML-Dateinamen definiert wird, werden in Dateien im Verzeichnis values/ mehrere Ressourcen beschrieben. Für eine Datei in diesem Verzeichnis definiert jedes untergeordnete Element des -Elements eine einzelne Ressource. Beispielsweise wird mit einem -Element eine R.string-Ressource und mit einem -Element eine R.color-Ressource erstellt.

Da jede Ressource mit einem eigenen XML-Element definiert wird, können Sie die Datei beliebig benennen und verschiedene Ressourcentypen in einer Datei platzieren. Aus Gründen der Übersichtlichkeit sollten Sie eindeutige Ressourcentypen jedoch in verschiedenen Dateien platzieren. Hier sind einige Beispiele für Dateinamenkonventionen für Ressourcen, die Sie in diesem Verzeichnis erstellen können:

Weitere Informationen finden Sie unter String-Ressourcen, Stilressourcen und Weitere Ressourcentypen.

xml/

Beliebige XML-Dateien, die zur Laufzeit durch Aufrufen von Resources.getXML() gelesen werden können. Hier müssen verschiedene XML-Konfigurationsdateien gespeichert werden.

font/

Schriftartdateien mit Erweiterungen wie TTF, OTF oder TTC oder XML-Dateien, die ein -Element enthalten. Weitere Informationen zu Schriftarten als Ressourcen finden Sie unter Schriftart als XML-Ressource hinzufügen.

Die Ressourcen, die Sie in den in Tabelle 1 definierten Unterverzeichnissen speichern, sind Ihre Standardressourcen. Diese Ressourcen definieren das Standarddesign und den Standardinhalt für Ihre App. Für verschiedene Arten von Android-Geräten sind jedoch möglicherweise unterschiedliche Arten von Ressourcen erforderlich.

Sie können beispielsweise verschiedene Layoutressourcen für Geräte mit größeren als normalen Bildschirmen bereitstellen, um den zusätzlichen Bildschirmplatz optimal zu nutzen. Sie können auch verschiedene String-Ressourcen bereitstellen, die den Text in Ihrer Benutzeroberfläche basierend auf der Spracheinstellung des Geräts übersetzen. Wenn Sie diese verschiedenen Ressourcen für verschiedene Gerätekonfigurationen bereitstellen möchten, müssen Sie zusätzlich zu Ihren Standardressourcen alternative Ressourcen angeben.

Alternative Ressourcen bereitstellen

Die meisten Apps bieten alternative Ressourcen zur Unterstützung bestimmter Gerätekonfigurationen. Fügen Sie beispielsweise alternative Drawables für verschiedene Bildschirmdichten und alternative String-Ressourcen für verschiedene Sprachen ein. Zur Laufzeit erkennt Android die aktuelle Gerätekonfiguration und lädt die entsprechenden Ressourcen für Ihre App.

Abbildung 1: Zwei Geräte, die je nach Bildschirmgröße unterschiedliche Layoutressourcen verwenden.

So geben Sie konfigurationsspezifische Alternativen für eine Reihe von Ressourcen an:

  1. Erstellen Sie in res/ ein neues Verzeichnis mit dem Namen <resources_name>-<qualifier>.

    • <resources_name> ist der Verzeichnisname der entsprechenden Standardressourcen (in Tabelle 1 definiert).
    • <qualifier> ist ein Name, der eine einzelne Konfiguration angibt, für die diese Ressourcen verwendet werden sollen (in Tabelle 2 definiert).

    Sie können mehrere <qualifier> anhängen. Trennen Sie die einzelnen Elemente durch einen Bindestrich.

  2. Speichern Sie die entsprechenden alternativen Ressourcen in diesem neuen Verzeichnis. Die Ressourcendateien müssen genau wie die Standardressourcendateien benannt werden.

Hier sind einige Standard- und alternative Ressourcen:

res/
    drawable/
        icon.png
        background.png
    drawable-hdpi/
        icon.png
        background.png

Der Qualifizierer hdpi gibt an, dass die Ressourcen in diesem Verzeichnis für Geräte mit einem Bildschirm mit hoher Dichte bestimmt sind. Die Bilder in diesen Drawable-Verzeichnissen sind für bestimmte Bildschirmdichten optimiert, die Dateinamen sind jedoch identisch. So bleibt die Ressourcen-ID, mit der Sie auf das icon.png- oder background.png-Bild verweisen, immer gleich. Android wählt die Version jeder Ressource aus, die am besten zum aktuellen Gerät passt. Dazu werden die Gerätekonfigurationsinformationen mit den Qualifizierern im Namen des Ressourcenverzeichnisses verglichen.

In Tabelle 2 sind die gültigen Konfigurationsqualifizierer in der Reihenfolge ihrer Priorität aufgeführt. Sie können einem Verzeichnisnamen mehrere Qualifizierer hinzufügen, indem Sie die einzelnen Qualifizierer durch einen Bindestrich trennen. Wenn Sie mehrere Qualifizierer für ein Ressourcenverzeichnis verwenden, müssen Sie sie in der Reihenfolge, in der sie in der Tabelle aufgeführt sind, dem Verzeichnisnamen hinzufügen.

Tabelle 2: Namen von Konfigurationskennzeichnern.

Konfiguration

Qualifierwerte

Beschreibung

MCC und MNC

Beispiele:

mcc310

mcc310-mnc004

mcc208-mnc00

Der Ländercode des Mobilgeräts (Mobile Country Code, MCC), optional gefolgt vom Netzwerkcode des Mobilgeräts (Mobile Network Code, MNC) der SIM-Karte im Gerät. Beispiele: mcc310 steht für die USA bei einem beliebigen Mobilfunkanbieter, mcc310-mnc004 für die USA bei Verizon und mcc208-mnc00 für Frankreich bei Orange.

Wenn das Gerät eine Funkverbindung verwendet (d. h. ein GSM-Telefon ist), stammen die MCC- und MNC-Werte von der SIM-Karte.

Sie können auch nur den MCC verwenden, um beispielsweise länderspezifische rechtliche Ressourcen in Ihre App aufzunehmen. Wenn Sie nur anhand der Sprache angeben müssen, verwenden Sie stattdessen den Qualifier Sprache, Schriftsystem (optional) und Region (optional). Wenn Sie den Qualifikator „MCC“ und „MNC“ verwenden, gehen Sie sorgfältig vor und testen Sie, ob er wie erwartet funktioniert.

Sehen Sie sich auch die Konfigurationsfelder mcc und mnc an, die den aktuellen Mobile Country Code und die Mobilfunknetzkennzahl angeben.

Sprache, Schriftart (optional) und Region (optional)

Beispiele:

en

fr

en-rUS

fr-rFR

fr-rCA

b+en

b+en+US

b+es+419

b+zh+Hant

b+sr+Latn+RS

Die Sprache wird durch einen zweistelligen ISO 639-2-Sprachcode{:.external} definiert, optional gefolgt von einem zweistelligen ISO 3166-1-Alpha-2-Regionscode{:.external} (vorangestellt durch Kleinbuchstaben r).

Bei den Codes wird nicht zwischen Groß- und Kleinschreibung unterschieden. Das Präfix r wird verwendet, um den Regionsabschnitt zu unterscheiden. Sie können keine Region allein angeben.

Mit Android 7.0 (API-Level 24) wurde die Unterstützung für BCP 47-Sprachentags{:.external} eingeführt, mit denen Sie sprach- und regionsspezifische Ressourcen qualifizieren können. Ein Sprach-Tag besteht aus einer Sequenz von einem oder mehreren Untertags, die jeweils den Bereich der durch das gesamte Tag identifizierten Sprache verfeinern oder eingrenzen. Weitere Informationen zu Sprach-Tags finden Sie unter Tags zur Identifizierung von Sprachen{:.external}.

Um einen BCP 47-Sprachcode zu verwenden, hängen Sie b+ und einen zweistelligen ISO 639-2-Sprachcode{:.external} aneinander an. Optional können Sie weitere Untertags hinzufügen, die durch + getrennt sind.

Das Sprach-Tag kann sich im Laufe der Lebensdauer Ihrer App ändern, wenn Nutzer die Sprache in den Systemeinstellungen ändern. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirken kann, finden Sie unter Konfigurationsänderungen verarbeiten.

Eine vollständige Anleitung zur Lokalisierung Ihrer App für andere Sprachen finden Sie unter App lokalisieren.

Sehen Sie sich auch die Methode getLocales an, die die definierte Liste der Gebietsschemas enthält. Diese Liste enthält das primäre Gebietsschema.

Genus masculine
feminine
neuter

Das grammatische Geschlecht des Nutzers. Wird für Sprachen mit grammatischem Geschlecht verwendet.

Wenn Sie beispielsweise unterschiedliche Ressourcen für französischsprachige Nutzer bereitstellen müssen, können Sie Verzeichnisse wie die folgenden verwenden:

res/
  values-fr/
    strings.xml (Standardstrings mit nicht angegebenem Geschlecht)
  values-fr-masculine/
    strings.xml (Strings mit männlichem Geschlecht)
  values-fr-feminine/
    strings.xml (Strings mit weiblichem Geschlecht)
  values-fr-neuter/
    strings.xml (Strings mit neutralem Geschlecht)

Weitere Informationen finden Sie unter Grammatische Form in Android.

Weitere Informationen finden Sie unter der getGrammaticalGender()-Konfigurationsmethode, die das grammatische Geschlecht angibt.

In API-Level 34 hinzugefügt.

Layoutrichtung

ldrtl

ldltr

Die Layoutrichtung Ihrer App. ldrtl bedeutet „layout-direction-right-to-left“. ldltr bedeutet „layout-direction-left-to-right“ und ist der implizite Standardwert.

Das kann für jede Ressource gelten, z. B. für Layouts, Drawables oder Werte.

Wenn Sie beispielsweise ein bestimmtes Layout für Arabisch und ein allgemeines Layout für alle anderen linksläufigen Sprachen wie Persisch oder Hebräisch bereitstellen möchten, verwenden Sie Verzeichnisse wie die folgenden:

res/
layout/
main.xml
(Standardlayout)
layout-ar/
main.xml (spezielles Layout für Arabisch)
layout-ldrtl/
main.xml (alle Sprachen mit Schreibrichtung von rechts nach links außer Arabisch, da der Sprachqualifizierer „ar“ eine höhere Priorität hat)

Hinweis: Wenn Sie Funktionen für das Layout von rechts nach links für Ihre App aktivieren möchten, müssen Sie SupportsRtl auf „true“ und TargetSdkVersion auf 17 oder höher festlegen.

In API-Level 17 hinzugefügt.

Geringste Breite

swdp

Beispiele:

sw320dp

sw600dp

sw720dp

usw.

Die kürzeste Abmessung des Bildschirmbereichs, der einer App zur Verfügung steht. Konkret ist die smallestWidth des App-Fensters die kürzeste der verfügbaren Höhe und Breite des Fensters. Sie können sich das auch als die „kleinstmögliche Breite“ für das Fenster vorstellen. Mit diesem Qualifier können Sie dafür sorgen, dass für die Benutzeroberfläche Ihrer App mindestens  dps an Breite verfügbar sind.

Wenn für Ihr Layout beispielsweise immer eine Mindestbreite von 600 dp erforderlich ist, können Sie diesen Qualifizierer verwenden, um die Layoutressourcen in einem res/layout-sw600dp/-Verzeichnis zu erstellen. Das System verwendet diese Ressourcen nur, wenn die kleinste Dimension des verfügbaren Bildschirms mindestens 600 dp beträgt. Dabei spielt es keine Rolle, ob die 600 dp die vom Nutzer wahrgenommene Höhe oder Breite sind. Die kleinste Breite kann sich ändern, wenn die Größe des Fensters angepasst wird, wodurch sich die verfügbare Breite/Höhe ändert, oder wenn das Fenster neu positioniert wird, wodurch sich möglicherweise die Systeminsets ändern.

Die Verwendung der kleinsten Breite zur Bestimmung der allgemeinen Bildschirmgröße ist nützlich, da die Breite oft der entscheidende Faktor beim Entwerfen eines Layouts ist. Eine Benutzeroberfläche wird oft vertikal gescrollt, hat aber ziemlich strenge Einschränkungen hinsichtlich des horizontalen Mindestplatzes.

Die verfügbare Breite ist auch der entscheidende Faktor dafür, ob für Smartphones ein Layout mit einem Bereich oder für Tablets ein Layout mit mehreren Bereichen verwendet wird. Daher ist es für Sie wahrscheinlich am wichtigsten, die kleinstmögliche Breite auf jedem Gerät zu kennen.

Bei der kleinsten Breite eines Geräts werden Bildschirmdekorationen und die System-UI berücksichtigt. Wenn das Gerät beispielsweise dauerhafte UI-Elemente auf dem Bildschirm hat, die Platz entlang der Achse der kleinsten Breite einnehmen, deklariert das System die kleinste Breite als kleiner als die tatsächliche Bildschirmgröße, da diese Bildschirmpixel nicht für Ihre Benutzeroberfläche verfügbar sind.

Hier sind einige Werte, die Sie für gängige Bildschirmgrößen verwenden können:

  • 320 für Geräte mit Bildschirmkonfigurationen wie:
    • 240 × 320 ldpi (QVGA-Smartphone)
    • 320 × 480 mdpi (Mobiltelefon)
    • 480 × 800 hdpi (Smartphone mit hoher Pixeldichte)
  • 480 für Bildschirme wie 480 × 800 MDPI (Tablet/Smartphone)
  • 600 für Bildschirme wie 600 × 1.024 mdpi (7‑Zoll-Tablet)
  • 720 für Bildschirme wie 720 × 1.280 mdpi (10‑Zoll-Tablet)

Wenn Ihre App mehrere Ressourcenverzeichnisse mit unterschiedlichen Werten für den smallestWidth-Qualifier bereitstellt, verwendet das System das Verzeichnis, dessen smallestWidth dem smallestWidth des Geräts am nächsten kommt (ohne es zu überschreiten).

In API-Level 13 hinzugefügt.

Sehen Sie sich auch das Attribut android:requiresSmallestWidthDp an, mit dem die Mindest-smallestWidth deklariert wird, mit der Ihre App kompatibel ist, sowie das Konfigurationsfeld smallestScreenWidthDp, das den smallestWidth-Wert des Geräts enthält.

Weitere Informationen zum Entwerfen für verschiedene Bildschirme mit diesem Qualifizierer finden Sie unter Responsives/adaptives Design mit Ansichten.

Verfügbare Breite und Höhe

wdp

hdp

Beispiele:

w720dp

w1024dp

h720dp

h1024dp

usw.

Gibt die minimale verfügbare Bildschirmbreite oder ‑höhe (in dp-Einheiten, die durch den Wert definiert werden) an, bei der die Ressource verwendet wird. Diese Konfigurationswerte werden mit der aktuellen Breite und Höhe des Displays verglichen, wenn sich die Geräteausrichtung zwischen Hoch- und Querformat ändert, das Gerät zusammen- oder aufgeklappt wird oder das System in den Mehrfenstermodus wechselt oder diesen verlässt. Im Mehrfenstermodus geben die Werte die Breite und Höhe des Fensters an, das die App enthält, nicht die Breite und Höhe des Gerätebildschirms. Bei eingebetteten Aktivitäten beziehen sich die Werte auf die Breite und Höhe der einzelnen Aktivitäten, nicht auf die Breite und Höhe des Bildschirms. Weitere Informationen finden Sie unter Aktivitätseinbettung.

Die verfügbare Breite und Höhe sind oft nützlich, um zu bestimmen, ob ein Layout mit mehreren Bereichen verwendet werden soll. Selbst auf einem Tablet ist das Layout mit mehreren Bereichen im Hochformat oft nicht dasselbe wie im Querformat. Sie können damit also die für das Layout erforderliche Mindestbreite und/oder ‑höhe angeben, anstatt die Qualifizierer für Bildschirmgröße und ‑ausrichtung zusammen zu verwenden.

Wenn Ihre App mehrere Ressourcenverzeichnisse mit unterschiedlichen Werten für diese Konfigurationen bereitstellt, verwendet das System das Verzeichnis, das der aktuellen Bildschirmbreite des Geräts am nächsten kommt (ohne sie zu überschreiten). Am nächsten wird ermittelt, indem die Differenzen zwischen der tatsächlichen Bildschirmbreite und der angegebenen Breite zur Differenz zwischen der tatsächlichen Bildschirmhöhe und der angegebenen Höhe addiert werden. Nicht angegebene Höhen und Breiten haben den Wert 0.

Die Werte schließen den Bereich aus, der von Fenstereinsätzen belegt wird. Wenn das Gerät also dauerhafte UI-Elemente an den Rändern des Displays hat, sind die Werte für Breite und Höhe kleiner als die tatsächlichen Bildschirmabmessungen, auch wenn die App mit Window.setDecorFitsSystemWindows oder WindowCompat.setDecorFitsSystemWindows von Rand zu Rand angezeigt wird.

Einige vertikale Bildschirmdekorationen, die nicht fixiert sind (z. B. eine Telefonstatusleiste, die im Vollbildmodus ausgeblendet werden kann), werden hier nicht berücksichtigt. Das gilt auch für Fensterdekorationen wie die Titelleiste oder die Aktionsleiste. Apps müssen also mit einem etwas kleineren Bereich als angegeben zurechtkommen.

Hinweis: Das System wählt die Ressource aus, die sowohl in Breite als auch in Höhe übereinstimmt. Daher ist eine Ressource, die beide angibt, einer Ressource, die nur eine der beiden angibt, vorzuziehen. Wenn der tatsächliche Bildschirm beispielsweise 720 dp breit und 1.280 dp hoch ist und eine Ressource mit w720dp und eine andere mit w700dp-h1200dp qualifiziert ist, wird die zweite Ressource ausgewählt, obwohl die erste genau mit den angegebenen Werten übereinstimmt.

In API-Level 13 hinzugefügt.

Sehen Sie sich auch die Konfigurationsfelder screenWidthDp und screenHeightDp an, die die aktuelle Bildschirmbreite und ‑höhe enthalten.

Weitere Informationen zum Entwerfen für verschiedene Bildschirme mit diesem Qualifizierer finden Sie unter Responsives/adaptives Design mit Ansichten.

Bildschirmgröße

small

normal

large

xlarge

  • small: Bildschirme, die eine ähnliche Größe wie ein QVGA-Bildschirm mit niedriger Pixeldichte haben. Die Mindestlayoutgröße für einen kleinen Bildschirm beträgt etwa 320 × 426 dp-Einheiten. Beispiele sind QVGA mit geringer Dichte und VGA mit hoher Dichte.
  • normal: Bildschirme, die in etwa die Größe eines HVGA-Bildschirms mit mittlerer Dichte haben. Die Mindestlayoutgröße für einen normalen Bildschirm beträgt etwa 320 × 470 dp-Einheiten. Beispiele für solche Bildschirme sind WQVGA mit niedriger Dichte, HVGA mit mittlerer Dichte und WVGA mit hoher Dichte.
  • large: Bildschirme, die in etwa die Größe eines VGA-Bildschirms mit mittlerer Dichte haben. Die Mindestlayoutgröße für einen großen Bildschirm beträgt etwa 480 × 640 dp-Einheiten. Beispiele sind VGA- und WVGA-Bildschirme mit mittlerer Dichte.
  • xlarge: Bildschirme, die deutlich größer sind als der herkömmliche HVGA-Bildschirm mit mittlerer Dichte. Die Mindestlayoutgröße für einen sehr großen Bildschirm beträgt etwa 720 × 960 dp-Einheiten. In den meisten Fällen sind Geräte mit extragroßen Displays zu groß, um in einer Tasche getragen zu werden. Wahrscheinlich handelt es sich um Geräte im Tablet-Stil. In API-Level 9 hinzugefügt.

Hinweis: Die Verwendung eines Größenqualifizierers bedeutet nicht, dass die Ressourcen nur für Bildschirme dieser Größe bestimmt sind. Wenn Sie keine alternativen Ressourcen mit Qualifizierern bereitstellen, die besser zur aktuellen Gerätekonfiguration passen, kann das System die Ressourcen verwenden, die am besten passen.

Achtung: Wenn alle Ihre Ressourcen einen Größenqualifizierer verwenden, der größer als der aktuelle Bildschirm ist, verwendet das System sie nicht und Ihre App stürzt zur Laufzeit ab. Das ist beispielsweise der Fall, wenn alle Layoutressourcen mit dem Qualifikator xlarge getaggt sind, das Gerät aber einen Bildschirm normaler Größe hat.

In API-Level 4 hinzugefügt.

Sehen Sie sich auch das Konfigurationsfeld screenLayout an, das angibt, ob der Bildschirm klein, normal oder groß ist.

Weitere Informationen finden Sie unter Bildschirmkompatibilität – Übersicht.

Bildformat

long

notlong

  • long: lange Bildschirme wie WQVGA, WVGA, FWVGA
  • notlong: keine langen Bildschirme wie QVGA, HVGA und VGA

In API-Level 4 hinzugefügt.

Das hängt nur vom Seitenverhältnis des Bildschirms ab (ein long-Bildschirm ist breiter). Das hat nichts mit der Bildschirmausrichtung zu tun.

Sehen Sie sich auch das Konfigurationsfeld screenLayout an, das angibt, ob der Bildschirm lang ist.

Rundes Display

round

notround

  • round: runde Displays, z. B. bei einem runden Wearable
  • notround: rechteckige Bildschirme wie Smartphones oder Tablets

In API-Level 23 hinzugefügt.

Sehen Sie sich auch die isScreenRound-Konfigurationsmethode an, die angibt, ob das Display rund ist.

Breite Farbskala

widecg

nowidecg

  • widecg: Displays mit einem breiten Farbraum wie Display P3 oder AdobeRGB
  • nowidecg: Displays mit einem schmalen Farbgamut wie sRGB

Hinzugefügt in API-Level 26.

Weitere Informationen finden Sie unter isScreenWideColorGamut-Konfigurationsmethode. Dort wird angegeben, ob der Bildschirm einen großen Farbraum hat.

High Dynamic Range (HDR)

highdr

lowdr

  • highdr: Displays mit einem hohen Dynamikbereich
  • lowdr: Displays mit einem niedrigen/standardmäßigen Dynamikbereich

Hinzugefügt in API-Level 26.

Weitere Informationen finden Sie unter isScreenHdr-Konfigurationsmethode. Dort wird angegeben, ob der Bildschirm HDR-fähig ist.

Bildschirmausrichtung

port

land

  • port: Das Gerät befindet sich im Hochformat (vertikal).
  • land: Das Gerät befindet sich im Querformat (horizontal).

Dies kann sich im Laufe der Nutzung Ihrer App ändern, wenn der Nutzer den Bildschirm dreht. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Weitere Informationen finden Sie auch im Konfigurationsfeld orientation, das die aktuelle Geräteausrichtung angibt.

UI-Modus

car

desk

television

appliance

watch

vrheadset

  • car: Das Gerät wird in einem Kfz-Dock angezeigt.
  • desk: Das Gerät wird in einem Dock angezeigt.
  • television: Das Gerät wird auf einem Fernseher angezeigt und bietet eine „Ten-Foot“-Erfahrung, bei der die Benutzeroberfläche auf einem großen Bildschirm angezeigt wird, der Nutzer weit entfernt ist, und die Interaktion hauptsächlich über das Steuerkreuz oder andere Nicht-Pointer-Interaktionen erfolgt.
  • appliance: Das Gerät dient als Haushaltsgerät ohne Display.
  • watch: Das Gerät hat ein Display und wird am Handgelenk getragen.
  • vrheadset: Das Gerät wird in einem Virtual-Reality-Headset angezeigt.

Hinzugefügt in API-Level 8; Fernseher hinzugefügt in API 13; Haushaltsgerät hinzugefügt in API 16; Smartwatch hinzugefügt in API 20; VR-Headset hinzugefügt in API 26.

Informationen dazu, wie Ihre App reagieren kann, wenn das Gerät in ein Dock eingesetzt oder aus einem Dock entfernt wird, finden Sie unter Dockingstatus und ‑typ ermitteln und überwachen.

Dies kann sich im Laufe der Lebensdauer Ihrer App ändern, wenn der Nutzer das Gerät in ein Dock stellt. Einige dieser Modi lassen sich über UiModeManager aktivieren oder deaktivieren. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Nachtmodus

night

notnight

  • night: Nacht
  • notnight: Tageszeit

In API-Level 8 hinzugefügt.

Das kann sich im Laufe der Lebensdauer Ihrer App ändern, wenn der Nachtmodus im automatischen Modus (Standard) belassen wird. In diesem Fall ändert sich der Modus je nach Tageszeit. Sie können diesen Modus mit UiModeManager aktivieren oder deaktivieren. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Pixeldichte des Displays (dpi)

ldpi

mdpi

hdpi

xhdpi

xxhdpi

xxxhdpi

nodpi

tvdpi

anydpi

nnndpi

  • ldpi: Bildschirme mit niedriger Dichte, ca. 120 dpi.
  • mdpi: Bildschirme mit mittlerer Dichte (auf herkömmlichen HVGA-Bildschirmen); etwa 160 dpi.
  • hdpi: Bildschirme mit hoher Dichte, ca. 240 dpi.
  • xhdpi: Bildschirme mit besonders hoher Dichte, etwa 320 dpi. In API-Level 8 hinzugefügt.
  • xxhdpi: Bildschirme mit besonders hoher Dichte, ca. 480 dpi. In API-Level 16 hinzugefügt.
  • xxxhdpi: Für die Verwendung mit extra-extra-extra-hoher Dichte (nur Launcher-Symbol – siehe Verschiedene Pixeldichten unterstützen); ca. 640 dpi. In API-Level 18 hinzugefügt.
  • nodpi: Wird für Bitmap-Ressourcen verwendet, die nicht an die Gerätedichte angepasst werden sollen.
  • tvdpi: Bildschirme mit einer Auflösung zwischen „mdpi“ und „hdpi“, etwa 213 dpi. Dies wird nicht als „primäre“ Dichtegruppe betrachtet. Sie ist hauptsächlich für 720p-Fernseher vorgesehen und wird von den meisten Apps nicht benötigt. Verwende für 1080p-TV-Panels xhdpi und für 4K-TV-Panels xxxhdpi. In API-Level 13 hinzugefügt.
  • anydpi: Entspricht allen Bildschirmdichten und hat Vorrang vor anderen Qualifizierern. Dies ist nützlich für Vektordrawables. Hinzugefügt in API-Level 21.
  • nnndpi: Wird verwendet, um nicht standardmäßige Dichten darzustellen. nnn ist eine positive Ganzzahl für die Bildschirmdichte. In den meisten Fällen wird dies nicht verwendet. Durch die Verwendung von Standarddichte-Buckets wird der Aufwand für die Unterstützung der verschiedenen Gerätedichten auf dem Markt erheblich reduziert.

Zwischen den sechs primären Dichten (ohne die tvdpi-Dichte) besteht ein Skalierungsverhältnis von 3:4:6:8:12:16. Eine 9 × 9-Bitmap in ldpi ist also 12 × 12 in mdpi, 18 × 18 in hdpi, 24 × 24 in xhdpi usw.

Hinweis: Die Verwendung eines Pixeldichte-Kennzeichners bedeutet nicht, dass die Ressourcen nur für Bildschirme mit dieser Dichte bestimmt sind. Wenn Sie keine alternativen Ressourcen mit Qualifizierern bereitstellen, die besser zur aktuellen Gerätekonfiguration passen, verwendet das System die Ressourcen, die am besten passen.

Weitere Informationen zum Umgang mit verschiedenen Bildschirmdichten und dazu, wie Android Ihre Bitmaps an die aktuelle Dichte anpasst, finden Sie unter Bildschirmkompatibilität – Übersicht.

Touchscreentyp

notouch

finger

  • notouch: Das Gerät hat keinen Touchscreen.
  • finger: Das Gerät hat einen Touchscreen, der durch direkte Interaktion mit dem Finger des Nutzers bedient werden soll.

Weitere Informationen finden Sie auch im Konfigurationsfeld touchscreen, das den Typ des Touchscreens auf dem Gerät angibt.

Verfügbarkeit der Tastatur

keysexposed

keyshidden

keyssoft

  • keysexposed: Auf dem Gerät ist eine Tastatur verfügbar. Wenn auf dem Gerät eine Softwaretastatur aktiviert ist (was wahrscheinlich ist), wird diese auch dann verwendet, wenn die Hardwaretastatur dem Nutzer nicht angezeigt wird oder das Gerät keine Hardwaretastatur hat. Wenn keine Softwaretastatur bereitgestellt oder sie deaktiviert ist, wird diese Einstellung nur verwendet, wenn eine Hardwaretastatur verfügbar ist.
  • keyshidden: Das Gerät hat eine Hardwaretastatur, die jedoch ausgeblendet ist und auf dem Gerät keine Softwaretastatur aktiviert ist.
  • keyssoft: Auf dem Gerät ist eine Softwaretastatur aktiviert, unabhängig davon, ob sie sichtbar ist oder nicht.

Wenn Sie keysexposed-Ressourcen, aber keine keyssoft-Ressourcen bereitstellen, verwendet das System die keysexposed-Ressourcen unabhängig davon, ob eine Tastatur sichtbar ist, sofern das System eine Softwaretastatur aktiviert hat.

Dies kann sich während der Lebensdauer Ihrer App ändern, wenn der Nutzer eine Hardwaretastatur öffnet. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Sehen Sie sich auch die Konfigurationsfelder hardKeyboardHidden und keyboardHidden an, die die Sichtbarkeit einer Hardwaretastatur bzw. einer beliebigen Tastatur (einschließlich Software) angeben.

Primäre Texteingabemethode

nokeys

qwerty

12key

  • nokeys: Das Gerät hat keine Hardwaretasten für die Texteingabe.
  • qwerty: Das Gerät hat eine QWERTY-Tastatur, unabhängig davon, ob sie für den Nutzer sichtbar ist.
  • 12key: Das Gerät hat eine Hardwaretastatur mit 12 Tasten, unabhängig davon, ob sie für den Nutzer sichtbar ist.

Sehen Sie sich auch das Konfigurationsfeld keyboard an, das die primäre verfügbare Methode für die Texteingabe angibt.

Verfügbarkeit von Navigationstasten

navexposed

navhidden

  • navexposed: Navigationsschlüssel sind für den Nutzer verfügbar.
  • navhidden: Navigationstasten sind nicht verfügbar (z. B. bei geschlossenem Deckel).

Das kann sich im Laufe der Lebensdauer Ihrer App ändern, wenn der Nutzer die Navigationstasten einblendet. Informationen dazu, wie sich das auf Ihre App während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Sehen Sie sich auch das Konfigurationsfeld navigationHidden an, das angibt, ob die Navigationstasten ausgeblendet sind.

Primäre Navigationsmethode ohne Touch-Bedienung

nonav

dpad

trackball

wheel

  • nonav: Das Gerät bietet keine Navigationsfunktion außer über den Touchscreen.
  • dpad: Das Gerät hat ein Steuerkreuz zur Navigation.
  • trackball: Das Gerät hat einen Trackball zur Navigation.
  • wheel: Das Gerät hat ein oder mehrere Steuerräder für die Navigation (ungewöhnlich).

Sehen Sie sich auch das Konfigurationsfeld navigation an, das den verfügbaren Navigationstyp angibt.

Plattformversion (API-Level)

Beispiele:

v3

v4

v7

usw.

Das vom Gerät unterstützte API-Level. Beispiel: v1 für API-Level 1 (Geräte mit Android 1.0 oder höher) und v4 für API-Level 4 (Geräte mit Android 1.6 oder höher). Weitere Informationen zu diesen Werten finden Sie im Dokument Android API-Levels.

Regeln für Namen von Qualifizierern

Hier sind einige Regeln für die Verwendung von Konfigurationsqualifizierernamen:

  • Sie können mehrere Qualifizierer für eine einzelne Gruppe von Ressourcen angeben, die durch Bindestriche getrennt sind. drawable-en-rUS-land gilt beispielsweise für Geräte mit US-Englisch im Querformat.
  • Die Qualifizierer müssen in der Reihenfolge aufgeführt sein, die in Tabelle 2 angegeben ist.
    • Falsch: drawable-hdpi-port/
    • Richtig: drawable-port-hdpi/
  • Alternative Ressourcenverzeichnisse können nicht verschachtelt werden. res/drawable/drawable-en/ ist beispielsweise nicht zulässig.
  • Bei den Werten wird die Groß- und Kleinschreibung nicht berücksichtigt. Der Ressourcencompiler konvertiert Verzeichnisnamen vor der Verarbeitung in Kleinbuchstaben, um Probleme auf Dateisystemen zu vermeiden, bei denen die Groß-/Kleinschreibung keine Rolle spielt. Die Großschreibung in den Namen dient nur der Lesbarkeit.
  • Es wird nur ein Wert für jeden Qualifizierertyp unterstützt. Wenn Sie beispielsweise dieselben Drawable-Dateien für Spanien und Frankreich verwenden möchten, dürfen Sie kein Verzeichnis mit dem Namen drawable-es-fr/ haben. Stattdessen benötigen Sie zwei Ressourcenverzeichnisse, z. B. drawable-es/ und drawable-fr/, die die entsprechenden Dateien enthalten. Sie müssen die Dateien jedoch nicht tatsächlich an beiden Speicherorten duplizieren. Stattdessen können Sie einen Alias für eine Ressource erstellen, wie im Abschnitt Aliasressourcen erstellen beschrieben.

Nachdem Sie alternative Ressourcen in Verzeichnissen gespeichert haben, die mit diesen Qualifizierern benannt sind, wendet Android die Ressourcen in Ihrer App automatisch basierend auf der aktuellen Gerätekonfiguration an. Jedes Mal, wenn eine Ressource angefordert wird, sucht Android nach alternativen Ressourcenverzeichnissen, die die angeforderte Ressourcendatei enthalten, und findet dann die am besten passende Ressource.

Wenn es keine alternativen Ressourcen gibt, die einer bestimmten Gerätekonfiguration entsprechen, verwendet Android die entsprechenden Standardressourcen. Das sind die Ressourcen für einen bestimmten Ressourcentyp, die keinen Konfigurationsqualifizierer enthalten.

Aliasressourcen erstellen

Wenn Sie eine Ressource haben, die Sie für mehr als eine Gerätekonfiguration verwenden möchten, aber nicht als Standardressource bereitstellen möchten, müssen Sie sie nicht in mehr als ein alternatives Ressourcenverzeichnis einfügen. Stattdessen können Sie eine alternative Ressource erstellen, die als Alias für eine Ressource dient, die in Ihrem Standardressourcenverzeichnis gespeichert ist.

Angenommen, Sie haben ein App-Symbol (icon.png) und benötigen eine eindeutige Version davon für verschiedene Sprachen. Für die beiden Sprachen Englisch (Kanada) und Französisch (Kanada) muss jedoch dieselbe Version verwendet werden. Sie müssen dasselbe Bild nicht in das Verzeichnis der Ressourcen für Englisch-Kanada und Französisch-Kanada kopieren. Stattdessen können Sie das Bild, das für beide verwendet wird, unter einem beliebigen Namen außer icon.png speichern, z. B. icon_ca.png, und es in das Standardverzeichnis res/drawable/ einfügen. Erstellen Sie dann in res/drawable-en-rCA/ und res/drawable-fr-rCA/ eine icon.xml-Datei, die mit dem Element <bitmap> auf die icon_ca.png-Ressource verweist. So können Sie nur eine Version der PNG-Datei und zwei kleine XML-Dateien speichern, die darauf verweisen. Weitere Informationen finden Sie in den Beispielen in den folgenden Abschnitten.

Drawable

Verwenden Sie das Element <drawable>, um einen Alias für eine vorhandene Drawable zu erstellen:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <drawable name="icon">@drawable/icon_ca</drawable>
</resources>

Wenn Sie diese Datei als icon.xml in einem alternativen Ressourcenverzeichnis wie res/values-en-rCA/ speichern, wird sie in eine Ressource kompiliert, auf die Sie als R.drawable.icon verweisen können. Sie ist jedoch eigentlich ein Alias für die Ressource R.drawable.icon_ca, die in res/drawable/ gespeichert ist.

Layout

Verwenden Sie das <include>-Element, das in ein <merge>-Element eingeschlossen ist, um einen Alias für ein vorhandenes Layout zu erstellen:

<?xml version="1.0" encoding="utf-8"?>
<merge>
  <include layout="@layout/main_ltr"/>
</merge>

Wenn Sie diese Datei als main.xml speichern, wird sie in eine Ressource kompiliert, auf die Sie als R.layout.main verweisen können. Sie ist jedoch eigentlich ein Alias für die R.layout.main_ltr-Ressource.

Auf App-Ressourcen zugreifen

Wenn Sie eine Ressource in Ihrer Anwendung bereitgestellt haben, können Sie sie anwenden, indem Sie auf ihre Ressourcen-ID verweisen. Alle Ressourcen-IDs sind in der Klasse R Ihres Projekts definiert, die vom Tool aapt automatisch generiert wird.

Wenn Ihre Anwendung kompiliert wird, generiert aapt die Klasse R, die Ressourcen-IDs für alle Ressourcen in Ihrem res/-Verzeichnis enthält. Für jeden Ressourcentyp gibt es eine R-Unterklasse, z. B. R.drawable für alle Drawables. Für jede Ressource dieses Typs gibt es eine statische Ganzzahl, z. B. R.drawable.icon. Diese Ganzzahl ist die Ressourcen-ID, mit der Sie Ihre Ressource abrufen können.

Obwohl die Ressourcen-IDs in der Klasse R angegeben werden, müssen Sie dort nicht nach einer Ressourcen-ID suchen. Eine Ressourcen-ID besteht immer aus Folgendem:

  • Der Ressourcentyp: Jede Ressource wird in einen „Typ“ gruppiert, z. B. string, drawable und layout. Weitere Informationen zu den verschiedenen Typen finden Sie unter Ressourcentypen – Übersicht.
  • Der Ressourcennamen, der entweder der Dateiname ohne die Erweiterung oder der Wert im XML-Attribut android:name ist, wenn die Ressource ein einfacher Wert wie ein String ist.

Es gibt zwei Möglichkeiten, auf eine Ressource zuzugreifen:

  • Im Code: Verwenden Sie eine statische Ganzzahl aus einer untergeordneten Klasse Ihrer R-Klasse, z. B.: R.string.hello string ist der Ressourcentyp und hello der Ressourcenname. Es gibt viele Android-APIs, die auf Ihre Ressourcen zugreifen können, wenn Sie eine Ressourcen-ID in diesem Format angeben. Weitere Informationen finden Sie im Abschnitt Auf Ressourcen im Code zugreifen.
  • In XML: mit einer speziellen XML-Syntax, die der in Ihrer R-Klasse definierten Ressourcen-ID entspricht, z. B.: @string/hello string ist der Ressourcentyp und hello der Ressourcenname. Sie können diese Syntax in einer XML-Ressource überall dort verwenden, wo ein Wert erwartet wird, den Sie in einer Ressource angeben. Weitere Informationen finden Sie im Abschnitt Auf Ressourcen über XML zugreifen.

Auf Ressourcen im Code zugreifen

Sie können eine Ressource im Code verwenden, indem Sie die Ressourcen-ID als Methodenparameter übergeben. Sie können beispielsweise ein ImageView so festlegen, dass die res/drawable/myimage.png-Ressource mit setImageResource verwendet wird:

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);

Sie können auch einzelne Ressourcen mit Methoden in Resources abrufen, deren Instanz Sie mit getResources erhalten.

Syntax

So referenzieren Sie eine Ressource im Code:

[<package_name>.]R.<resource_type>.<resource_name>

  • <package_name> ist der Name des Pakets, in dem sich die Ressource befindet. Dies ist nicht erforderlich, wenn Sie auf Ressourcen aus Ihrem eigenen Paket verweisen.
  • <resource_type> ist die R-Unterklasse für den Ressourcentyp.
  • <resource_name> ist entweder der Ressourcen-Dateiname ohne die Erweiterung oder der android:name-Attributwert im XML-Element für einfache Werte.

Anwendungsfälle

Es gibt viele Methoden, die einen Parameter für die Ressourcen-ID akzeptieren. Sie können Ressourcen mit Methoden in Resources abrufen. Sie können eine Instanz von Resources mit Context.getResources abrufen.

Hier sind einige Beispiele für den Zugriff auf Ressourcen im Code:

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);

Über XML auf Ressourcen zugreifen

Sie können Werte für einige XML-Attribute und -Elemente mithilfe einer Referenz auf eine vorhandene Ressource definieren. Das ist häufig der Fall, wenn Sie Layoutdateien erstellen, um Strings und Bilder für Ihre Widgets bereitzustellen.

Wenn Sie Ihrem Layout beispielsweise ein Button hinzufügen, verwenden Sie eine String-Ressource für den Schaltflächentext:

<Button
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/submit" />

Syntax

Hier ist die Syntax zum Verweisen auf eine Ressource in einer XML-Ressource:

@[<package_name>:]<resource_type>/<resource_name>

  • <package_name> ist der Name des Pakets, in dem sich die Ressource befindet (nicht erforderlich, wenn auf Ressourcen aus demselben Paket verwiesen wird).
  • <resource_type> ist die R-Unterklasse für den Ressourcentyp.
  • <resource_name> ist entweder der Ressourcen-Dateiname ohne die Erweiterung oder der android:name-Attributwert im XML-Element für einfache Werte.

Anwendungsfälle

In einigen Fällen müssen Sie eine Ressource für einen Wert in XML verwenden, z. B. um ein Drawable-Bild auf ein Widget anzuwenden. Sie können eine Ressource in XML aber auch überall dort verwenden, wo ein einfacher Wert akzeptiert wird. Angenommen, Sie haben die folgende Ressourcendatei mit einer Farbressource und einer String-Ressource:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="opaque_red">#f00</color>
  <string name="hello">Hello!</string>
</resources>

Sie können diese Ressourcen in der folgenden Layoutdatei verwenden, um die Textfarbe und den Textstring festzulegen:

<?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" />

In diesem Fall müssen Sie den Paketnamen im Ressourcenverweis nicht angeben, da die Ressourcen aus Ihrem eigenen Paket stammen. Wenn Sie auf eine Systemressource verweisen möchten, müssen Sie den Paketnamen angeben, wie im folgenden Beispiel gezeigt:

<?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" />

Sie können sogar Ressourcen in XML verwenden, um Aliase zu erstellen. Sie können beispielsweise eine zeichenfähige Ressource erstellen, die ein Alias für eine andere zeichenfähige Ressource ist:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/other_drawable" />

Das klingt redundant, kann aber sehr nützlich sein, wenn Sie eine alternative Ressource verwenden. Weitere Informationen finden Sie im Abschnitt zum Erstellen von Aliasressourcen.

Attribute für Referenzstil

Mit einer Stilattributressource können Sie auf den Wert eines Attributs im aktuell angewendeten Theme verweisen. Wenn Sie auf ein Stilattribut verweisen, können Sie das Aussehen von UI-Elementen anpassen, indem Sie sie so gestalten, dass sie den Standardvariationen des aktuellen Designs entsprechen, anstatt einen hartcodierten Wert anzugeben. Wenn Sie auf ein Stilattribut verweisen, bedeutet das im Grunde: „Verwende den Stil, der durch dieses Attribut im aktuellen Design definiert ist.“

Wenn Sie auf ein Stilattribut verweisen möchten, ist die Namenssyntax fast identisch mit dem normalen Ressourcenformat. Verwenden Sie jedoch anstelle des „at“-Symbols (@) ein Fragezeichen (?). Der Ressourcentyp ist optional. Die Referenzsyntax lautet also:

?[<package_name>:][<resource_type>/]<resource_name>

So können Sie beispielsweise auf ein Attribut verweisen, um die Textfarbe an die sekundäre Textfarbe des Systemdesigns anzupassen:

<EditText id="text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textColor="?android:textColorSecondary"
  android:text="@string/hello_world" />

Das Attribut android:textColor gibt den Namen eines Stilattributs im aktuellen Design an. Unter Android wird jetzt der Wert, der auf das Stilattribut android:textColorSecondary angewendet wird, als Wert für android:textColor in diesem Widget verwendet. Da das Systemressourcentool weiß, dass in diesem Kontext eine Attributressource erwartet wird, müssen Sie den Typ, der ?android:attr/textColorSecondary ist, nicht explizit angeben. Sie können den Typ attr ausschließen.

Auf Originaldateien zugreifen

Es kann vorkommen, dass Sie auf Ihre Originaldateien und ‑verzeichnisse zugreifen müssen. Wenn das der Fall ist, können Sie Ihre Dateien nicht in res/ speichern, da Ressourcen in res/ nur über die Ressourcen-ID gelesen werden können. Stattdessen können Sie Ihre Ressourcen im Verzeichnis assets/ speichern.

Dateien, die im Verzeichnis assets/ gespeichert sind, erhalten keine Ressourcen-ID. Sie können also nicht über die Klasse R oder über XML-Ressourcen darauf verweisen. Stattdessen können Sie Dateien im Verzeichnis assets/ wie in einem normalen Dateisystem abfragen und Rohdaten mit AssetManager lesen.

Wenn Sie jedoch nur Rohdaten (z. B. eine Video- oder Audiodatei) lesen müssen, speichern Sie die Datei im Verzeichnis res/raw/ und lesen Sie einen Stream von Byte mit openRawResource.

Auf Plattformressourcen zugreifen

Android enthält eine Reihe von Standardressourcen wie Stile, Designs und Layouts. Um auf diese Ressourcen zuzugreifen, müssen Sie Ihren Ressourcenverweis mit dem Paketnamen android qualifizieren. Android bietet beispielsweise eine Layoutressource, die Sie für Listenelemente in einem ListAdapter verwenden können:

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));

In diesem Beispiel ist simple_list_item_1 eine von der Plattform definierte Layoutressource für Elemente in einem ListView. Sie können diese Option verwenden, anstatt ein eigenes Layout für Listenelemente zu erstellen.

Beste Gerätekompatibilität mit Ressourcen

Damit Ihre App mehrere Gerätekonfigurationen unterstützt, ist es sehr wichtig, dass Sie immer Standardressourcen für jeden Ressourcentyp bereitstellen, den Ihre App verwendet.

Wenn Ihre App beispielsweise mehrere Sprachen unterstützt, fügen Sie immer ein values/-Verzeichnis (in dem Ihre Strings gespeichert sind) ohne Sprach- und Regionsqualifizierer ein. Wenn Sie stattdessen alle Ihre String-Dateien in Verzeichnisse mit einem Sprach- und Regionsqualifizierer einfügen, stürzt Ihre App ab, wenn sie auf einem Gerät ausgeführt wird, das auf eine Sprache eingestellt ist, die von Ihren Strings nicht unterstützt wird.

Solange Sie Standardressourcen für values/ bereitstellen, funktioniert Ihre App ordnungsgemäß, auch wenn der Nutzer die Sprache nicht versteht, in der sie präsentiert wird. Besser als ein Absturz.

Wenn Sie verschiedene Layoutressourcen basierend auf der Bildschirmausrichtung bereitstellen, wählen Sie eine Ausrichtung als Standard aus. Anstatt beispielsweise Layoutressourcen in layout-land/ für das Querformat und in layout-port/ für das Hochformat bereitzustellen, lassen Sie eine als Standardeinstellung, z. B. layout/ für das Querformat und layout-port/ für das Hochformat.

Die Bereitstellung von Standardressourcen ist nicht nur wichtig, weil Ihre App möglicherweise in einer Konfiguration ausgeführt wird, die Sie nicht erwartet haben, sondern auch, weil in neuen Android-Versionen manchmal Konfigurationsqualifizierer hinzugefügt werden, die in niedrigeren Versionen nicht unterstützt werden. Wenn Sie einen neuen Ressourcenqualifizierer verwenden, aber die Codekompatibilität mit niedrigeren Android-Versionen beibehalten, stürzt Ihre App ab, wenn sie auf einer niedrigeren Android-Version ausgeführt wird, sofern Sie keine Standardressourcen bereitstellen. Das liegt daran, dass die Ressourcen, die mit dem neuen Qualifizierer benannt sind, nicht verwendet werden können.

Wenn Ihr minSdkVersion beispielsweise auf 4 festgelegt ist und Sie alle Ihre Drawable-Ressourcen mit dem Nachtmodus (night oder notnight, die in API-Level 8 hinzugefügt wurden) qualifizieren, kann ein Gerät mit API-Level 4 nicht auf Ihre Drawable-Ressourcen zugreifen und stürzt ab. In diesem Fall sollten notnight wahrscheinlich Ihre Standardressourcen sein. Schließen Sie diesen Qualifier also aus und legen Sie Ihre Drawable-Ressourcen entweder in drawable/ oder drawable-night/ ab.

Kurz gesagt: Um die beste Gerätekompatibilität zu gewährleisten, sollten Sie immer Standardressourcen für die Ressourcen bereitstellen, die Ihre App für eine ordnungsgemäße Funktion benötigt. Erstellen Sie dann mit Konfigurationsqualifizierern alternative Ressourcen für bestimmte Gerätekonfigurationen.

Es gibt eine Ausnahme von dieser Regel: Wenn die minSdkVersion Ihrer App 4 oder höher ist, benötigen Sie keine Standard-Drawable-Ressourcen, wenn Sie alternative Drawable-Ressourcen mit dem Qualifikator Bildschirmdichte bereitstellen. Auch ohne Standard-Drawable-Ressourcen kann Android die beste Übereinstimmung unter den alternativen Bildschirmdichten finden und die Bitmaps nach Bedarf skalieren. Für eine optimale Darstellung auf allen Gerätetypen sollten Sie jedoch alternative Drawables für alle drei Dichtetypen bereitstellen.