Anwendungsressourcen

Ressourcen sind die zusätzlichen Dateien und statischen Inhalte, die Ihr Code verwendet, z. B. Bitmaps, Layoutdefinitionen, Benutzeroberflächen-Strings, Animationsanleitungen und mehr.

Externalisieren Sie Anwendungsressourcen wie Bilder und Strings immer aus Ihrem Code, damit Sie sie unabhängig verwalten können. Sie können auch alternative Ressourcen für bestimmte Gerätekonfigurationen bereitstellen, indem Sie sie in speziell benannten Ressourcenverzeichnissen gruppieren. Während der Laufzeit verwendet Android die entsprechende Ressource basierend auf der aktuellen Konfiguration. Sie können beispielsweise je nach Bildschirmgröße ein anderes UI-Layout bereitstellen oder je nach Spracheinstellung unterschiedliche Strings verwenden.

Nachdem Sie Ihre Anwendungsressourcen externalisiert haben, können Sie mithilfe von Ressourcen-IDs, die in der R-Klasse Ihres Projekts generiert werden, darauf zugreifen. In diesem Dokument erfahren Sie, wie Sie die Ressourcen in Ihrem Android-Projekt gruppieren können. 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 können.

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.

Hinweis:Weitere Informationen zur Verwendung der Mipmap-Ordner finden Sie unter Anwendungssymbole in Mipmap-Verzeichnisse einfügen.

Tabelle 1 Ressourcenverzeichnisse, die im Projektverzeichnis res/ unterstützt werden.

Verzeichnis Ressourcentyp
animator/ XML-Dateien, die Property-Animationen definieren
anim/ XML-Dateien, die Tween-Animationen definieren Eigenschaftsanimationen können auch in diesem Verzeichnis gespeichert werden. Allerdings wird das Verzeichnis animator/ für Attributanimationen bevorzugt, um zwischen den beiden Typen zu unterscheiden.
color/ XML-Dateien, die eine Farbliste der Status definieren. Weitere Informationen finden Sie unter Ressourcen für die Liste des Farbstatus.
drawable/

Bitmapdateien (PNG, .9.png, JPG oder GIF) oder XML-Dateien, die in die folgenden Drawable-Ressourcenuntertypen kompiliert sind:

  • Bitmapdateien
  • Neun Patches (Bitmaps mit neuer Größe)
  • Statuslisten
  • Formen
  • Animations-Drawables
  • Andere Drawables

Weitere Informationen findest du unter Drawable-Ressourcen.

mipmap/ Drawable-Dateien für verschiedene Dichten von Launcher-Symbolen Weitere Informationen zum Verwalten von Launcher-Symbolen mit mipmap/-Ordnern findest du unter App-Symbole in Mipmap-Verzeichnisse einfügen.
layout/ XML-Dateien, die ein Layout der Benutzeroberfläche definieren. Weitere Informationen finden Sie unter Layoutressource.
menu/ XML-Dateien, mit denen Anwendungsmenüs definiert werden, z. B. ein Optionsmenü, ein Kontextmenü oder ein Untermenü. Weitere Informationen finden Sie unter Menüressource.
raw/

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

Wenn Sie jedoch Zugriff auf die ursprünglichen Dateinamen und die Dateihierarchie benötigen, sollten Sie Ressourcen im Verzeichnis assets/ statt im 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 Zeichenfolgen, Ganzzahlen und Farben enthalten.

Während XML-Ressourcendateien in anderen res/-Unterverzeichnissen eine einzelne Ressource basierend auf dem XML-Dateinamen definieren, beschreiben Dateien im Verzeichnis values/ mehrere Ressourcen. Für eine Datei in diesem Verzeichnis definiert jedes dem <resources>-Element untergeordnete Element eine einzelne Ressource. Beispielsweise erstellt ein <string>-Element eine R.string-Ressource und ein <color>-Element eine R.color-Ressource.

Da jede Ressource mit einem eigenen XML-Element definiert ist, können Sie der Datei einen beliebigen Namen geben und verschiedene Ressourcentypen in einer Datei platzieren. Möglicherweise möchten Sie jedoch eindeutige Ressourcentypen in verschiedenen Dateien platzieren. Hier sind einige Dateinamenskonventionen für Ressourcen, die Sie in diesem Verzeichnis erstellen können:

Weitere Informationen finden Sie unter Stringressourcen, Stilressource 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, z. B. eine Suchkonfiguration.
font/ Schriftartdateien mit Erweiterungen wie TTF, OTF oder TTC oder XML-Dateien, die ein <font-family>-Element enthalten. Weitere Informationen zu Schriftarten als Ressourcen finden Sie unter Schriftart als XML-Ressource hinzufügen.

Achtung:Speichern Sie Ressourcendateien niemals direkt im Verzeichnis res/. Dies verursacht einen Compiler-Fehler.

Weitere Informationen zu den einzelnen Ressourcentypen finden Sie in der Übersicht zu Ressourcentypen.

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

Sie können beispielsweise unterschiedliche Layoutressourcen für Geräte bereitstellen, die größer als normale Bildschirme sind, um den zusätzlichen Platz auf dem Bildschirm zu nutzen. Sie können auch verschiedene Stringressourcen bereitstellen, die den Text auf Ihrer Benutzeroberfläche je nach der Spracheinstellung des Geräts übersetzen. Damit Sie diese verschiedenen Ressourcen für verschiedene Gerätekonfigurationen bereitstellen können, müssen Sie zusätzlich zu Ihren Standardressourcen alternative Ressourcen bereitstellen.

Alternative Ressourcen bereitstellen

Die meisten Apps bieten alternative Ressourcen zur Unterstützung bestimmter Gerätekonfigurationen. Füge beispielsweise alternative Drawable-Ressourcen für verschiedene Bildschirmdichten und alternative String-Ressourcen für verschiedene Sprachen hinzu. Während der 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 (definiert in Tabelle 1).
    • <qualifier> ist ein Name, der eine einzelne Konfiguration angibt, für die diese Ressourcen verwendet werden sollen (definiert in Tabelle 2).

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

    Achtung:Wenn Sie mehrere Qualifizierer anhängen, müssen Sie diese in der gleichen Reihenfolge platzieren, in der sie in Tabelle 2 aufgeführt sind. Wenn die Qualifier nicht richtig angeordnet sind, werden die Ressourcen ignoriert.

  2. Speichern Sie die entsprechenden alternativen Ressourcen in diesem neuen Verzeichnis. Die Ressourcendateien müssen exakt denselben Namen wie die Standardressourcendateien haben.

Hier sind einige Standardressourcen 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 HD-Bildschirm bestimmt sind. Die Bilder in diesen Drawable-Verzeichnissen haben eine bestimmte Größe an bestimmte Bildschirmdichten, die Dateinamen sind jedoch identisch. Auf diese Weise ist die Ressourcen-ID, mit der Sie auf das icon.png- oder background.png-Image verweisen, immer identisch. Android wählt die Version jeder Ressource aus, die am besten mit dem aktuellen Gerät übereinstimmt, indem die Gerätekonfigurationsinformationen mit den Qualifiern im Namen des Ressourcenverzeichnisses verglichen werden.

Achtung:Definieren Sie beim Definieren einer alternativen Ressource unbedingt auch die Ressource in einer Standardkonfiguration. Andernfalls könnten bei Ihrer Anwendung Laufzeitausnahmen auftreten, wenn das Gerät eine Konfiguration ändert. Wenn Sie beispielsweise nur values-en und nicht values einen String hinzufügen, kann in Ihrer Anwendung die Ausnahme Resource Not Found auftreten, wenn der Nutzer die standardmäßige Systemsprache ändert.

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

Tabelle 2 die Namen der Konfigurationsqualifizierer.

Konfiguration Qualifier-Werte Beschreibung
Kundencenter und MNC Beispiele:
mcc310
mcc310-mnc004
mcc208-mnc00

Der Mobile Country Code (MCC), optional gefolgt vom Mobile Network Code (MNC) der SIM-Karte im Gerät. Beispiel: mcc310 steht bei allen Mobilfunkanbietern für die USA, mcc310-mnc004 bei Verizon für die USA und mcc208-mnc00 für Frankreich bei Orange.

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

Sie können beispielsweise auch nur das Verwaltungskonto verwenden, um länderspezifische rechtliche Ressourcen in Ihre App einzubinden. Wenn Sie dies nur basierend auf der Sprache angeben müssen, verwenden Sie stattdessen den Kennzeichner Sprache, Skript (optional) und Region (optional). Wenn du den Kundencenter- und den MNC-Qualifier verwendest, solltest du vorsichtig vorgehen und testen, ob er erwartungsgemäß funktioniert.

Sehen Sie sich auch die Konfigurationsfelder mcc und mnc an, die den aktuellen Ländercode für das Mobilgerät bzw. den aktuellen Mobilfunknetzcode angeben.

Sprache, Skript (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 aus zwei Buchstaben bestehenden ISO 639-1-Sprachcode definiert, optional gefolgt von einem aus zwei Buchstaben bestehenden ISO 3166-1-alpha-2-Regionscode, dem der kleingeschriebene r vorangestellt ist.

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

Mit Android 7.0 (API-Level 24) werden BCP 47-Sprach-Tags unterstützt, mit denen Sie sprach- und regionsspezifische Ressourcen qualifizieren können. Ein Sprach-Tag besteht aus einer Sequenz von einem oder mehreren Untertags, von denen jedes den vom Gesamt-Tag ermittelten Sprachbereich eingrenzt oder eingrenzt. Weitere Informationen zu Sprach-Tags finden Sie unter Tags zur Identifizierung von Sprachen.

Wenn Sie ein BCP 47-Sprach-Tag verwenden möchten, verketten Sie b+ mit einem aus zwei Buchstaben bestehenden ISO 639-1-Sprachcode, gefolgt von optionalen, durch + getrennten Untertags.

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

Eine vollständige Anleitung zum Lokalisieren Ihrer App in andere Sprachen finden Sie unter App lokalisieren.

Weitere Informationen finden Sie in der Methode getLocales(), mit der die definierte Liste der Sprachen bereitgestellt wird. Diese Liste enthält die primäre Sprache.

Layoutrichtung ldrtl
ldltr

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

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

Wenn Sie beispielsweise ein spezielles Layout für die arabische Sprache und ein generisches Layout für eine andere linksläufige Sprache wie Persisch oder Hebräisch angeben 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 (beliebige Sprache mit Ausnahme von rechts nach links, außer Arabisch, weil der Sprachqualifizierer „ar“ eine höhere Priorität hat)

Hinweis:Wenn Sie Funktionen für das linksläufige Layout für Ihre App aktivieren möchten, müssen Sie SupportsRtl auf "true" und TargetSdkVersion auf 17 oder höher setzen.

In API-Level 17 hinzugefügt.

Geringste Breite sw<N>dp

Beispiele:
sw320dp
sw600dp
sw720dp
usw.

Die kürzeste Abmessung des Bildschirmbereichs, die für eine App verfügbar ist. Das smallestWidth des App-Fensters ist die kürzeste verfügbare Höhe und Breite des Fensters. Sie können es sich auch als die "kleinstmögliche Breite" des Fensters vorstellen. Mit diesem Qualifizierer können Sie dafür sorgen, dass für die Benutzeroberfläche Ihrer Anwendung eine Breite von mindestens <N> dps verfügbar ist.

Wenn Ihr Layout beispielsweise erfordert, dass die kleinste Dimension des Bildschirmbereichs mindestens 600 dp beträgt, 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, unabhängig davon, ob die 600 dp Seite die vom Nutzer wahrgenommene Höhe oder Breite ist. Die kleinste Breite kann sich ändern, wenn die Größe des Fensters, die verfügbare Breite/Höhe geändert oder neu positioniert wird, wodurch sich unter Umständen die Systemeinfügungen ändern.

Es ist nützlich, die kleinste Breite zu verwenden, um die allgemeine Bildschirmgröße zu bestimmen, da sie oft der entscheidende Faktor beim Entwerfen eines Layouts ist. Eine UI scrollt oft vertikal, allerdings gibt es recht große Einschränkungen im Hinblick auf den erforderlichen Mindestabstand in horizontaler Richtung.

Die verfügbare Breite ist auch der Schlüsselfaktor bei der Entscheidung, ob ein Ein-Fenster-Layout für Mobilgeräte oder ein Mehrfenster-Layout für Tablets verwendet werden soll. Daher ist die kleinstmögliche Breite für jedes Gerät wahrscheinlich am wichtigsten.

Die kleinste Breite eines Geräts berücksichtigt Bildschirmdekorationen und die System-UI. Wenn das Gerät beispielsweise persistente UI-Elemente auf dem Bildschirm hat, die den Platz entlang der Achse der kleinsten Breite ausmachen, gibt das System an, dass die kleinste Breite kleiner als die tatsächliche Bildschirmgröße ist, da diese Bildschirmpixel nicht für Ihre UI verfügbar sind.

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

  • 320, für Geräte mit Bildschirmkonfigurationen wie:
    • 240 x 320 ldpi (QVGA-Handy)
    • 320 x 480 MDPI (Mobilgerät)
    • 480 x 800 hdpi (High-Density-Handy)
  • 480, für Bildschirme wie 480 x 800 MDPI (Tablet/Mobiltelefon)
  • 600, für Bildschirme wie 600 x 1024 MDPI (7"-Tablet)
  • 720, für Bildschirme wie 720 x 1280 MDPI (10"-Tablet)

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

In API-Level 13 hinzugefügt.

Weitere Informationen findest du im Attribut android:requiresSmallestWidthDp, das den minimalen smallestWidth-Wert angibt, mit dem deine App kompatibel ist, und das smallestScreenWidthDp-Konfigurationsfeld, das den smallestWidth-Wert des Geräts enthält.

Weitere Informationen zum Design für verschiedene Bildschirme mit diesem Qualifier finden Sie unter Unterstützung verschiedener Bildschirmgrößen.

Verfügbare Breite und Höhe w<N>dp
h<N>dp

Beispiele:
w720dp
w1024dp
h720dp
h1024dp
usw.

Gibt die minimale verfügbare Bildschirmbreite oder -höhe an (in dp-Einheiten, die durch den Wert <N> definiert sind), in der die Ressource verwendet wird. Diese Konfigurationswerte werden mit der aktuellen Breite und Höhe des Displays verglichen, wenn die Geräteausrichtung zwischen Hoch- und Querformat wechselt, das Gerät auf- oder zugeklappt wird oder das System in den Mehrfenstermodus wechselt oder diesen verlässt. Im Mehrfenstermodus spiegeln die Werte die Breite und Höhe des Fensters wider, das die App enthält, nicht die Breite und Höhe des Gerätebildschirms. Ebenso beziehen sich bei eingebetteten Aktivitäten 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ügbaren Breiten und Höhen sind oft hilfreich, um zu bestimmen, ob Sie ein Mehrfensterlayout verwenden sollten, da Sie selbst auf einem Tablet oft nicht dasselbe Mehrfensterlayout für das Hochformat benötigen wie für das Querformat. So können Sie also die Mindestbreite und/oder -höhe angeben, die für das Layout erforderlich sind, anstatt die Qualifier 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 diese zu überschreiten). Nähe an wird ermittelt, indem die Differenz zwischen der tatsächlichen und der angegebenen Breite zur Differenz zwischen der tatsächlichen und der angegebenen Höhe addiert wird. Die angegebenen Höhen und Breiten haben dabei den Wert 0.

Die Werte schließen den von Fenster-Einsätzen eingenommenen Bereich aus. Wenn das Gerät also an den Displayrändern UI-Elemente 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 Bildschirmelemente, die nicht festgelegt sind, z. B. eine Smartphone-Statusleiste, die im Vollbildmodus ausgeblendet werden kann, werden hier nicht berücksichtigt. Dasselbe gilt für Fenstergestaltungen wie die Titel- oder Aktionsleiste. Daher müssen Apps mit etwas kleinerem Platz umgehen können als angegeben.

Hinweis: Das System wählt die Ressource aus, deren Breite und Höhe jeweils übereinstimmen. Daher wird eine Ressource, die beides angibt, deutlich bevorzugt vor einer Ressource, die nur eine der beiden Optionen angibt. Wenn der tatsächliche Bildschirm beispielsweise 720 dp breit und 1.280 dp hoch ist und eine Ressource mit w720dp und eine andere als w700dp-h1200dp qualifiziert ist, wird Letztere ausgewählt, obwohl erstere genau mit der angegebenen übereinstimmt.

In API-Level 13 hinzugefügt.

Sieh dir auch die Konfigurationsfelder screenWidthDp und screenHeightDp an, die die aktuelle Bildschirmbreite und -höhe enthalten.

Weitere Informationen zum Design für verschiedene Bildschirme mit diesem Qualifier finden Sie unter Unterstützung verschiedener Bildschirmgrößen.

Displaygröße small
normal
large
xlarge
  • small: Bildschirme, die eine ähnliche Größe wie ein QVGA-Bildschirm mit niedriger Dichte haben. Die minimale Layoutgröße für einen kleinen Bildschirm beträgt etwa 320 x 426 dp-Einheiten. Beispiele hierfür sind QVGA Low Density und VGA High Density.
  • normal: Bildschirme, die eine ähnliche Größe wie ein HVGA-Bildschirm mit mittlerer Dichte haben. Die minimale Layoutgröße für einen normalen Bildschirm beträgt etwa 320 x 470 dp-Einheiten. Beispiele für solche Bildschirme sind WQVGA-Bildschirme mit niedriger Dichte, HVGA mittlerer Dichte und WVGA-Bildschirme mit hoher Dichte.
  • large: Bildschirme, die eine ähnliche Größe wie ein VGA-Bildschirm mit mittlerer Dichte haben. Die minimale Layoutgröße für einen großen Bildschirm beträgt etwa 480 x 640 dp-Einheiten. Beispiele sind VGA- und WVGA-Bildschirme mit mittlerer Dichte.
  • xlarge: Bildschirme, die deutlich größer sind als ein herkömmliches HVGA-Bildschirm mit mittlerer Dichte. Die minimale Layoutgröße für einen großen Bildschirm beträgt etwa 720 x 960 dp-Einheiten. In den meisten Fällen sind Geräte mit extragroßem Display zu groß, um in eine Hosentasche zu passen. Meistens handelt es sich dabei um Geräte im Tablet-Stil. In API-Level 9 hinzugefügt.

Hinweis:Die Verwendung eines Größenkennzeichners bedeutet nicht, dass die Ressourcen nur für Bildschirme dieser Größe gelten. Wenn Sie keine alternativen Ressourcen mit Qualifizierern bereitstellen, die besser der aktuellen Gerätekonfiguration entsprechen, kann das System die besten Ressourcen verwenden.

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

In API-Level 4 hinzugefügt.

Im Konfigurationsfeld screenLayout wird angegeben, ob der Bildschirm klein, normal oder groß ist.

Weitere Informationen findest du unter Bildschirmkompatibilität – Übersicht.

Display-Seitenverhältnis long
notlong
  • long: lange Bildschirme, z. B. WQVGA, WVGA, FWVGA
  • notlong: keine langen Bildschirme, wie z. B. QVGA, HVGA und VGA

In API-Level 4 hinzugefügt.

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

Im Konfigurationsfeld screenLayout wird angegeben, ob der Bildschirm lang ist.

Runder Bildschirm round
notround
  • round: runde Displays (z. B. ein rundes tragbares Gerät)
  • notround: rechteckige Bildschirme, z. B. Smartphones oder Tablets

In API-Level 23 hinzugefügt.

Die Konfigurationsmethode isScreenRound() gibt an, ob der Bildschirm rund ist.

Breiter Farbgamut widecg
nowidecg
  • widecg: Displays mit einem großen Farbskala wie Display P3 oder AdobeRGB
  • nowidecg: wird mit einem schmalen Farbskala wie sRGB angezeigt

In API-Level 26 hinzugefügt.

Die Konfigurationsmethode isScreenWideColorGamut() gibt an, ob der Bildschirm einen breiten Farbschatz hat.

High Dynamic Range (HDR) highdr
lowdr
  • highdr: Displays mit einem High Dynamic Range
  • lowdr: Displays mit einem niedrigen/Standard-Dynamikbereich

In API-Level 26 hinzugefügt.

Die Konfigurationsmethode isScreenHdr() gibt an, ob der Bildschirm HDR-fähig ist.

Bildschirmausrichtung port
land
  • port: Gerät wird im Hochformat (vertikal) gezeigt
  • land: Gerät ist im Querformat (horizontal)

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

Im Konfigurationsfeld orientation wird die aktuelle Geräteausrichtung angegeben.

UI-Modus car
desk
television
appliance
watch
vrheadset
  • car: Gerät wird im Dock des Autos angezeigt
  • desk: Gerät wird in einem Desktop-Dock angezeigt
  • television: Das Gerät wird auf einem Fernseher angezeigt und bietet die Benutzeroberfläche auf einem großen Bildschirm, von dem der Nutzer weit entfernt ist. Die Benutzeroberfläche ist in erster Linie auf das Steuerkreuz oder eine andere Interaktion ohne Zeiger ausgerichtet.
  • appliance: Gerät dient als Appliance und hat keinen Bildschirm
  • watch: Gerät hat ein Display und wird am Handgelenk getragen
  • vrheadset: Gerät wird in einem Virtual-Reality-Headset angezeigt

Hinzugefügt in API-Level 8, Fernseher in API 13, Smartwatch in API 20 hinzugefügt.

Informationen dazu, wie Ihre App reagieren kann, wenn das Gerät in ein Dock eingesetzt oder daraus entfernt wird, finden Sie unter Status und Typ der Docking-Funktion ermitteln und überwachen.

Dies kann sich im Laufe der Nutzungsdauer deiner App ändern, wenn der Nutzer das Gerät in ein Dock setzt. Einige dieser Modi können mit UiModeManager aktiviert oder deaktiviert werden. Informationen dazu, wie sich das auf Ihre Anwendung während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Nachtmodus night
notnight
  • night: Nacht
  • notnight: Uhrzeit

In API-Level 8 hinzugefügt.

Dies kann sich während 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 Anwendung während der Laufzeit auswirkt, finden Sie unter Konfigurationsänderungen verarbeiten.

Bildschirm-Pixeldichte (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
  • ldpi: Bildschirme mit geringer Dichte, ca. 120 dpi
  • mdpi: Bildschirme mittlerer Dichte (auf herkömmlichen HVGA-Bildschirmen), ca. 160 dpi
  • hdpi: HD-Bildschirme; ca. 240 dpi
  • xhdpi: Displays mit besonders hoher Punktdichte; ca. 320 dpi In API-Level 8 hinzugefügt.
  • xxhdpi: Displays mit besonders hoher Punktdichte; ca. 480 dpi In API-Level 16 hinzugefügt.
  • xxxhdpi: Verwendung mit besonders hoher Dichte (nur Launcher-Symbol – siehe Unterstützung unterschiedlicher Pixeldichten); ca. 640 dpi In API-Level 18 hinzugefügt.
  • nodpi: wird für Bitmapressourcen verwendet, die nicht an die Gerätedichte angepasst werden sollen.
  • tvdpi: Bildschirme zwischen mdpi und hdpi; ungefähr 213 dpi Dies wird nicht als „primäre“ Dichtegruppe betrachtet. Sie ist in erster Linie für 720p-Fernseher gedacht und wird für die 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: stimmt mit allen Bildschirmdichten überein und hat Vorrang vor anderen Qualifier. Das ist nützlich für Vektor-Drawables. In API-Level 21 hinzugefügt.
  • nnndpi: Wird zur Darstellung von nicht standardmäßigen Dichten verwendet, wobei nnn eine positive Ganzzahl ist. Dies wird in den meisten Fällen nicht verwendet. Wenn Sie Buckets mit Standarddichte verwenden, wird der Aufwand für die Unterstützung der verschiedenen Bildschirmdichten von Geräten auf dem Markt erheblich reduziert.

Zwischen den sechs primären Dichten gibt es ein Skalierungsverhältnis von 3:4:6:8:12:16 (und ignoriert die tvdpi-Dichte). Eine 9 x 9-Bitmap in ldpi ist also 12 x 12 in MDPI, 18 x 18 in HDPI, 24 x 24 in xhdpi und so weiter.

Hinweis:Die Verwendung eines Dichtekennzeichners bedeutet nicht, dass die Ressourcen nur für Bildschirme mit dieser Dichte vorgesehen sind. Wenn Sie keine alternativen Ressourcen mit Qualifier zur Verfügung stellen, die besser zur aktuellen Gerätekonfiguration passen, verwendet das System die Ressourcen, die am besten geeignet sind.

Weitere Informationen zum Umgang mit unterschiedlichen Bildschirmdichten und dazu, wie Android Ihre Bitmaps an die aktuelle Dichte anpassen könnte, 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 eine Richtungsinteraktion des Nutzers bedient werden kann.

Im Konfigurationsfeld touchscreen wird der Typ des Touchscreens auf dem Gerät angegeben.

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), wird diese auch dann verwendet, wenn die Hardwaretastatur nicht für den Nutzer zugänglich ist oder das Gerät keine Hardwaretastatur hat. Wenn keine Softwaretastatur vorhanden oder deaktiviert ist, wird diese Funktion nur verwendet, wenn eine Hardwaretastatur verfügbar ist.
  • keyshidden: Auf dem Gerät ist eine Hardwaretastatur verfügbar, diese ist aber verborgen und auf dem Gerät ist keine Softwaretastatur aktiviert.
  • 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 angeben, verwendet das System die keysexposed-Ressourcen unabhängig davon, ob eine Tastatur sichtbar ist, solange im System eine Softwaretastatur aktiviert ist.

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

Sehen Sie sich auch die Konfigurationsfelder hardKeyboardHidden und keyboardHidden an. Sie geben die Sichtbarkeit einer Hardwaretastatur bzw. die Sichtbarkeit jeglicher Tastaturen (einschließlich Software) an.

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

Im Konfigurationsfeld keyboard wird die verfügbare primäre Texteingabemethode angegeben.

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 zu den Android-API-Ebenen.

Hinweis:Nicht alle Android-Versionen unterstützen alle Qualifizierer. Bei Verwendung eines neuen Qualifiers wird implizit der Plattformversionsqualifizierer hinzugefügt, sodass er von älteren Geräten ignoriert werden kann. Bei Verwendung eines w600dp-Qualifiers wird beispielsweise automatisch der Qualifier v13 mit einbezogen, da der Qualifier für die verfügbare Breite in API-Level 13 neu war. Fügen Sie immer eine Reihe von Standardressourcen hinzu, d. h. eine Reihe von Ressourcen ohne Qualifier, um Probleme zu vermeiden. Weitere Informationen finden Sie im Abschnitt Optimale Gerätekompatibilität mit Ressourcen bereitstellen.

Regeln für Qualifier-Namen

Im Folgenden finden Sie einige Regeln zur Verwendung der Namen von Konfigurationsqualifizierern:

  • Sie können für eine einzelne Gruppe von Ressourcen mehrere Qualifizierer angeben, die durch Bindestriche getrennt sind. Beispielsweise gilt drawable-en-rUS-land für Geräte in US-Englisch im Querformat.
  • Die Qualifizierer müssen in der Reihenfolge angeordnet sein, in der sie in Tabelle 2 aufgeführt sind.
    • 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ß-/Kleinschreibung nicht berücksichtigt. Der Ressourcencompiler wandelt Verzeichnisnamen vor der Verarbeitung in Kleinbuchstaben um, um Probleme bei Dateisystemen zu vermeiden, bei denen die Groß-/Kleinschreibung nicht berücksichtigt wird. Die Großschreibung in den Namen dient nur der besseren Lesbarkeit.
  • Für jeden Qualifizierertyp wird nur ein Wert unterstützt. Wenn du beispielsweise für Spanien und Frankreich dieselben Drawable-Dateien verwenden möchtest, kannst du kein Verzeichnis namens drawable-es-fr/ haben. Stattdessen benötigen Sie zwei Ressourcenverzeichnisse wie drawable-es/ und drawable-fr/, die die entsprechenden Dateien enthalten. Sie müssen die Dateien jedoch nicht an beiden Speicherorten duplizieren. Stattdessen können Sie einen Alias für eine Ressource erstellen, wie im Abschnitt Alias-Ressourcen erstellen beschrieben.

Nachdem Sie alternative Ressourcen in Verzeichnissen gespeichert haben, die mit diesen Qualifizierern benannt sind, wendet Android die Ressourcen in Ihrer App automatisch auf Grundlage 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 übereinstimmende Ressource.

Wenn es keine alternativen Ressourcen gibt, die einer bestimmten Gerätekonfiguration entsprechen, verwendet Android die entsprechenden Standardressourcen, also den Satz von Ressourcen für einen bestimmten Ressourcentyp, der keinen Konfigurationsqualifizierer enthält.

Alias-Ressourcen erstellen

Wenn Sie eine Ressource für mehrere Gerätekonfigurationen verwenden, aber nicht als Standardressource bereitstellen möchten, müssen Sie dieselbe Ressource nicht in mehr als einem alternativen Ressourcenverzeichnis speichern. Stattdessen können Sie eine alternative Ressource erstellen, die als Alias für eine in Ihrem Standard-Ressourcenverzeichnis gespeicherte Ressource dient.

Hinweis: Nicht alle Ressourcen bieten einen Mechanismus, mit dem Sie einen Alias für eine andere Ressource erstellen können. Insbesondere für Animationen, Speisekarten, Rohdateien und andere nicht angegebene Ressourcen im Verzeichnis xml/ steht diese Funktion nicht zur Verfügung.

Angenommen, Sie haben das App-Symbol icon.png und benötigen eine eindeutige Version davon für verschiedene Sprachen. Allerdings muss für die beiden Sprachen Englisch-Kanada und Französisch-Kanada dieselbe Version verwendet werden. Sie müssen nicht dasselbe Image in das Ressourcenverzeichnis für Englisch (Kanada) und Französisch (Kanada) kopieren. Stattdessen können Sie das Image, das für beide verwendet wird, mit einem anderen Namen als icon.png speichern, z. B. icon_ca.png, und es im Standardverzeichnis res/drawable/ ablegen. Erstellen Sie dann eine icon.xml-Datei in res/drawable-en-rCA/ und res/drawable-fr-rCA/, die mit dem Element <bitmap> auf die Ressource icon_ca.png 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

Verwende das <drawable>-Element, um einen Alias für ein vorhandenes 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. Tatsächlich ist sie jedoch ein Alias für die Ressource R.drawable.icon_ca, die in res/drawable/ gespeichert ist.

Layout

Verwenden Sie das Element <include> in einem <merge>-Element, 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, die Sie als R.layout.main referenzieren können, tatsächlich aber ein Alias für die Ressource R.layout.main_ltr ist.

Strings und andere einfache Werte

Verwenden Sie die Ressourcen-ID des gewünschten Strings als Wert für den neuen String, um einen Alias für einen vorhandenen String zu erstellen:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello</string>
    <string name="hi">@string/hello</string>
</resources>

Die Ressource R.string.hi ist jetzt ein Alias für den R.string.hello.

Andere einfache Werte funktionieren auf die gleiche Weise, z. B. Farben:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#f00</color>
    <color name="highlight">@color/red</color>
</resources>

Auf Anwendungsressourcen zugreifen

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

Beim Kompilieren Ihrer Anwendung generiert aapt die Klasse R, die die Ressourcen-IDs für alle Ressourcen im Verzeichnis res/ enthält. Für jeden Ressourcentyp gibt es eine abgeleitete R-Klasse, z. B. R.drawable für alle Drawable-Ressourcen. Und 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 Ressourcen-IDs in der Klasse R angegeben werden, müssen Sie dort nicht suchen, um eine Ressourcen-ID zu ermitteln. Eine Ressourcen-ID setzt sich immer aus Folgendem zusammen:

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

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

  • Im Code: Verwendung einer statischen Ganzzahl aus einer abgeleiteten Klasse Ihrer R-Klasse. Beispiel:
    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: Verwenden Sie eine spezielle XML-Syntax, die der Ressourcen-ID entspricht, die in Ihrer R-Klasse definiert ist. Beispiel:
    @string/hello

    string ist der Ressourcentyp und hello der Ressourcenname. Sie können diese Syntax in einer XML-Ressource überall 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. So können Sie beispielsweise mit setImageResource() festlegen, dass ein ImageView die Ressource res/drawable/myimage.png verwendet:

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 den Methoden in Resources abrufen, für die Sie eine Instanz mit getResources() abrufen können.

Syntax

So sieht die Syntax für den Verweis auf eine Ressource im Code aus:

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

Weitere Informationen zu den einzelnen Ressourcentypen und wie Sie darauf verweisen können, finden Sie unter Ressourcentypen – Übersicht.

Anwendungsfälle

Es gibt viele Methoden, die einen Ressourcen-ID-Parameter akzeptieren. In Resources können Sie Ressourcen mithilfe von Methoden abrufen. Sie können mit Context.getResources() eine Instanz von Resources 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);

Achtung:Ändern Sie die Datei R.java nicht manuell. Sie wird vom aapt-Tool generiert, wenn Ihr Projekt kompiliert wird. Alle Änderungen werden bei der nächsten Kompilierung überschrieben.

Zugriff auf Ressourcen über XML

Sie können Werte für einige XML-Attribute und -Elemente mithilfe eines Verweises auf eine vorhandene Ressource definieren. Dies geschieht häufig bei der Erstellung von Layoutdateien, um Strings und Bilder für die Widgets bereitzustellen.

Wenn Sie beispielsweise Ihrem Layout eine 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 für den Verweis 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 abgeleitete R-Klasse für den Ressourcentyp.
  • <resource_name> ist entweder der Name der Ressourcendatei ohne Erweiterung oder der Attributwert android:name im XML-Element für einfache Werte.

Weitere Informationen zu den einzelnen Ressourcentypen und wie Sie darauf verweisen können, finden Sie unter Ressourcentypen – Übersicht.

Anwendungsfälle

In einigen Fällen musst du eine Ressource für einen Wert in XML verwenden, z. B. um ein Drawable-Bild auf ein Widget anzuwenden. Du kannst aber auch eine XML-Ressource für jede Stelle verwenden, die einen einfachen Wert akzeptiert. Angenommen, die folgende Ressourcendatei enthält eine Farbressource und eine String-Ressource:

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

Du kannst 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 nicht in der Ressourcenreferenz angeben, da die Ressourcen aus Ihrem eigenen Paket stammen. Um auf eine Systemressource zu verweisen, 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" />

Hinweis:Verwenden Sie immer Stringressourcen, damit Ihre Anwendung für andere Sprachen lokalisiert werden kann. Informationen zum Erstellen alternativer Ressourcen (z. B. lokalisierte Strings) findest du unter Alternative Ressourcen bereitstellen. Eine vollständige Anleitung zum Lokalisieren Ihrer Anwendung für andere Sprachen finden Sie unter Anwendung lokalisieren.

Sie können sogar Ressourcen in XML verwenden, um Aliasse zu erstellen. Sie können beispielsweise eine Drawable-Ressource erstellen, die ein Alias für eine andere Drawable-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 überflüssig, kann aber bei Verwendung einer alternativen Ressource sehr nützlich sein. Weitere Informationen finden Sie im Abschnitt zum Erstellen von Alias-Ressourcen.

Referenzstilattribute

Mit einer Stilattributressource können Sie auf den Wert eines Attributs im aktuell angewendeten Design verweisen. Wenn Sie auf ein Stilattribut verweisen, können Sie das Erscheinungsbild von UI-Elementen anpassen, indem Sie sie so gestalten, dass sie den Standardvarianten des aktuellen Designs entsprechen, anstatt einen hartcodierten Wert anzugeben. Der Verweis auf ein Stilattribut sagt im Wesentlichen: „Verwenden Sie den durch dieses Attribut im aktuellen Design definierten Stil.“

Um auf ein Stilattribut zu verweisen, ist die Namenssyntax fast identisch mit dem normalen Ressourcenformat. Verwenden Sie jedoch anstelle des At-Symbols (@) ein Fragezeichen (?). Der Teil des Ressourcentyps ist optional. Daher lautet die Referenzsyntax wie folgt:

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

So können Sie beispielsweise auf ein Attribut verweisen, um die Textfarbe so festzulegen, dass sie der sekundären Textfarbe des Systemdesigns entspricht:

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

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

Auf Originaldateien zugreifen

In seltenen Fällen benötigen Sie möglicherweise Zugriff auf Ihre ursprünglichen Dateien und Verzeichnisse. In diesem Fall funktioniert das Speichern Ihrer Dateien in res/ nicht, da eine Ressource nur über die Ressourcen-ID aus res/ gelesen werden kann. 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 auf sie verweisen. Stattdessen können Sie Dateien im Verzeichnis assets/ wie ein normales Dateisystem abfragen und Rohdaten mit AssetManager lesen.

Wenn Sie jedoch nur Rohdaten (z. B. eine Video- oder Audiodatei) lesen können, 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. Für den Zugriff auf diese Ressourcen müssen Sie Ihre Ressourcenreferenz 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 Layoutressource, die von der Plattform für Elemente in einer ListView definiert wird. Sie können dieses Layout verwenden, statt ein eigenes Layout für Listenelemente zu erstellen.

Für optimale Gerätekompatibilität mit Ressourcen sorgen

Damit Ihre Anwendung mehrere Gerätekonfigurationen unterstützt, ist es sehr wichtig, dass Sie für jeden von Ihrer Anwendung verwendeten Ressourcentyp immer Standardressourcen angeben.

Wenn Ihre App beispielsweise mehrere Sprachen unterstützt, geben Sie immer ein values/-Verzeichnis an, in dem Ihre Strings gespeichert sind, ohne Bezeichner für Sprache und Region. Wenn Sie stattdessen alle Ihre Stringdateien in Verzeichnissen mit einem Sprach- und Regions-Qualifier ablegen, stürzt Ihre App bei Ausführung auf einem Gerät ab, das auf eine Sprache eingestellt ist, die von Ihren Strings nicht unterstützt wird.

Solange Sie values/-Standardressourcen angeben, wird Ihre Anwendung auch dann ordnungsgemäß ausgeführt, wenn der Nutzer die dargestellte Sprache nicht versteht. Das ist besser als ein Absturz.

Wenn Sie je nach Bildschirmausrichtung unterschiedliche Layoutressourcen bereitstellen, wählen Sie ebenfalls eine Ausrichtung als Standard aus. Anstatt beispielsweise Layoutressourcen in layout-land/ für Querformat und layout-port/ für Hochformat bereitzustellen, belassen Sie eine der Standardressourcen, z. B. layout/ für Querformat und layout-port/ für Hochformat.

Die Bereitstellung von Standardressourcen ist nicht nur wichtig, weil Ihre Anwendung möglicherweise mit einer Konfiguration ausgeführt wird, die Sie nicht erwartet hatten, sondern auch, weil neue Versionen von Android manchmal Konfigurationsqualifizierer hinzufügen, die von älteren Versionen nicht unterstützt werden. Wenn Sie einen neuen Ressourcenqualifizierer verwenden, aber die Codekompatibilität mit älteren Android-Versionen beibehalten, stürzt Ihre App in einer älteren Android-Version ab, wenn Sie keine Standardressourcen angeben, da die mit dem neuen Qualifier benannten Ressourcen nicht verwendet werden können.

Wenn dein minSdkVersion beispielsweise auf 4 gesetzt ist und du alle deine Drawable-Ressourcen mit dem Nachtmodus qualifizieren (night oder notnight, die in API-Level 8 hinzugefügt wurden), kann ein API-Level-4-Gerät nicht auf deine Drawable-Ressourcen zugreifen und stürzt ab. In diesem Fall möchten Sie wahrscheinlich notnight als Standardressourcen verwenden. Schließen Sie diesen Qualifier aus und platzieren Sie die Drawable-Ressourcen entweder in drawable/ oder drawable-night/.

Kurz gesagt: Stellen Sie für eine optimale Gerätekompatibilität immer Standardressourcen für die Ressourcen bereit, die Ihre App ordnungsgemäß ausführen muss. Erstellen Sie dann mithilfe von Konfigurationsqualifizierern alternative Ressourcen für bestimmte Gerätekonfigurationen.

Es gibt eine Ausnahme von dieser Regel: Wenn die minSdkVersion deiner App 4 oder höher hat, benötigst du keine standardmäßigen Drawable-Ressourcen, wenn du alternative Drawable-Ressourcen mit dem Qualifier Bildschirmdichte angibst. Auch ohne standardmäßige Drawable-Ressourcen kann Android die beste Übereinstimmung unter den alternativen Bildschirmdichten finden und die Bitmaps nach Bedarf skalieren. Damit es jedoch auf allen Arten von Geräten optimal funktioniert, solltest du alternative Drawables für alle drei Arten von Dichten anbieten.

So findet Android die am besten übereinstimmende Ressource

Wenn Sie eine Ressource anfordern, für die Sie Alternativen bereitstellen, wählt Android je nach aktueller Gerätekonfiguration aus, welche alternative Ressource zur Laufzeit verwendet werden soll. Um zu zeigen, wie Android eine alternative Ressource auswählt, gehen wir davon aus, dass die folgenden Drawable-Verzeichnisse jeweils unterschiedliche Versionen derselben Bilder enthalten:

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

Gehen wir von der Gerätekonfiguration aus:

Sprache = en-GB
Bildschirmausrichtung = port
Pixeldichte des Bildschirms = hdpi
Touchscreen-Typ = notouch
Primäre Texteingabemethode = 12key

Durch einen Vergleich der Gerätekonfiguration mit den verfügbaren alternativen Ressourcen wählt Android Drawables aus drawable-en-port aus.

Das System trifft die Entscheidung, welche Ressourcen verwendet werden sollen, anhand der folgenden Logik:

Abbildung 2: Flussdiagramm dazu, wie Android die am besten übereinstimmende Ressource findet.

  1. Entfernen Sie Ressourcendateien, die der Gerätekonfiguration widersprechen.

    Das Verzeichnis drawable-fr-rCA/ wird entfernt, da es der Sprache en-GB widerspricht.

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

    Ausnahme:Die Bildschirmpixeldichte ist der einzige Kennzeichner, der nicht aufgrund eines Widerspruchs beseitigt wird. Obwohl die Bildschirmdichte des Geräts HDPI ist, wird drawable-port-ldpi/ nicht ausgeschlossen, da jede Bildschirmdichte an diesem Punkt als übereinstimmend angesehen wird. Weitere Informationen finden Sie unter Bildschirmkompatibilität – Übersicht.

  2. Suchen Sie in der Liste nach dem Qualifier mit der nächsthöheren Priorität (Tabelle 2). (Beginnen Sie mit dem Kundencenter.)
  3. Enthält eines der Ressourcenverzeichnisse diesen Qualifier?
    • Falls nicht, kehren Sie zu Schritt 2 zurück und sehen Sie sich den nächsten Qualifier an. In diesem Beispiel lautet die Antwort „Nein“, bis der Sprachqualifizierer erreicht ist.
    • Wenn ja, fahren Sie mit Schritt 4 fort.
  4. Entfernen Sie Ressourcenverzeichnisse, die diesen Qualifier nicht enthalten. In diesem Beispiel löscht das System als Nächstes alle Verzeichnisse, die keinen Sprachqualifizierer enthalten:
    drawable/
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

    Ausnahme:Wenn es sich bei dem betreffenden Qualifier um die Bildschirmpixeldichte handelt, wählt Android die Option aus, die der Bildschirmdichte des Geräts am ehesten entspricht. Im Allgemeinen bevorzugt Android ein größeres Originalbild anstelle eines kleineren Originalbilds. Weitere Informationen finden Sie unter Bildschirmkompatibilität – Übersicht.

  5. Wiederholen Sie die Schritte zwei, drei und vier, bis nur noch ein Verzeichnis übrig ist. In diesem Beispiel ist die Bildschirmausrichtung der nächste Qualifizierer, für den Übereinstimmungen vorliegen. Daher werden Ressourcen eliminiert, die keine Bildschirmausrichtung angeben:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    Das verbleibende Verzeichnis ist drawable-en-port.

Obwohl dieses Verfahren für jede angeforderte Ressource ausgeführt wird, optimiert das System einige Aspekte. Eine dieser Optimierungsmöglichkeiten besteht darin, dass, sobald die Gerätekonfiguration bekannt ist, alternative Ressourcen beseitigt werden können, die nie abgeglichen werden können. Wenn die Konfigurationssprache beispielsweise Englisch ist, wird jedes Ressourcenverzeichnis, für das ein Sprachqualifizierer auf einen anderen Wert als Englisch festgelegt ist, nie in den Pool der geprüften Ressourcen aufgenommen. Ein Ressourcenverzeichnis ohne den Sprachqualifizierer ist jedoch weiterhin enthalten.

Bei der Auswahl von Ressourcen basierend auf den Bildschirmgrößenkennzeichnern verwendet das System Ressourcen, die für einen Bildschirm kleiner als der aktuelle Bildschirm vorgesehen sind, wenn keine besser passenden Ressourcen vorhanden sind. Auf einem großen Bildschirm werden beispielsweise bei Bedarf normal große Bildschirmressourcen verwendet.

Wenn die einzigen verfügbaren Ressourcen jedoch größer als der aktuelle Bildschirm sind, werden sie vom System nicht verwendet und Ihre App stürzt ab, wenn keine anderen Ressourcen der Gerätekonfiguration entsprechen. Das passiert beispielsweise, wenn alle Layoutressourcen mit dem Qualifier xlarge getaggt sind, das Gerät aber einen normalen Bildschirm hat.

Hinweis:Der Vorrang des Qualifiers (in Tabelle 2) ist wichtiger als die Anzahl der Qualifier, die genau mit dem Gerät übereinstimmen. Im vorherigen Beispiel enthält in Schritt 4 die letzte Auswahl auf der Liste drei Qualifier, die genau mit dem Gerät übereinstimmen (Ausrichtung, Touchscreen-Typ und Eingabemethode), während drawable-en nur einen Parameter hat, der mit (Sprache) übereinstimmt. Da die Sprache jedoch eine höhere Priorität als diese anderen Qualifier hat, wurde drawable-port-notouch-12key eliminiert.