Anwendungsressourcen

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. So können Sie beispielsweise je nach Bildschirmgröße ein anderes UI-Layout oder je nach Spracheinstellung andere Strings bereitstellen.

Nachdem Sie die 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 wird gezeigt, 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 jede Art von Ressource 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 App-Symbole in Mipmap-Verzeichnisse einfügen.

Tabelle 1 Unterstützte Ressourcenverzeichnisse im Projektverzeichnis res/.

Verzeichnis Ressourcentyp
animator/ XML-Dateien, in denen Eigenschaftsanimationen definiert sind.
anim/ XML-Dateien, in denen Tween-Animationen definiert sind. 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 Farbzusammenfassung.
drawable/

Bitmap-Dateien (PNG, .9.png, JPG oder GIF) oder XML-Dateien, die in die folgenden untergeordneten Typen von Drawable-Ressourcen kompiliert werden:

  • Bitmap-Dateien
  • Nine-Patches (Bitmap-Ressourcen, 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. Sie können also nur mit AssetManager gelesen werden.

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 <resources>-Elements eine einzelne Ressource. Mit einem <string>-Element wird beispielsweise eine R.string-Ressource erstellt und mit einem <color>-Element eine R.color-Ressource.

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 empfiehlt es sich jedoch, eindeutige Ressourcentypen in verschiedenen Dateien zu 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, 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 führt zu einem Compilerfehler.

Weitere Informationen zu den einzelnen Ressourcentypen finden Sie unter Ressourcentypen – Übersicht.

Die Ressourcen, die Sie in den in Tabelle 1 definierten Unterverzeichnissen speichern, sind Ihre Standardressourcen. Diese Ressourcen definieren das Standarddesign und die Standardinhalte 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, mit denen der Text in Ihrer Benutzeroberfläche basierend auf der Spracheinstellung des Geräts übersetzt wird. Damit Sie diese verschiedenen Ressourcen für verschiedene Gerätekonfigurationen bereitstellen können, 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 Drawable-Ressourcen für verschiedene Bildschirmdichten und alternative String-Ressourcen für verschiedene Sprachen hinzu. 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.

    Achtung:Wenn Sie mehrere Qualifizierer anhängen, müssen Sie sie in derselben Reihenfolge wie in Tabelle 2 auflisten. Wenn die Qualifizierer in der falschen Reihenfolge angegeben sind, werden die Ressourcen ignoriert.

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

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.

Achtung:Wenn Sie eine alternative Ressource definieren, müssen Sie sie auch in einer Standardkonfiguration definieren. Andernfalls können bei Ihrer App Laufzeitfehler auftreten, wenn das Gerät eine Konfiguration ändert. Wenn Sie beispielsweise einen String nur in values-en und nicht in values hinzufügen, kann in Ihrer App eine Resource Not Found-Ausnahme auftreten, wenn der Nutzer die Standardsystemsprache ändert.

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 Kennzeichnerwerte 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 Qualifikator Sprache, Schriftsystem (optional) und Region (optional). Wenn Sie den Qualifikator „MCC“ und „MNC“ verwenden, gehen Sie vorsichtig vor und testen Sie, ob er wie erwartet funktioniert.

Sehen Sie sich auch die Konfigurationsfelder mcc und mnc an, die den aktuellen Länder- bzw. Netzwerkcode des Mobilgeräts 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-1-Sprachcode definiert, dem optional ein zweistelliger ISO 3166-1-Alpha-2-Regionscode (vorangestellt durch Kleinbuchstaben r) folgen kann.

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-Sprachtags 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.

Um einen BCP 47-Sprachcode zu verwenden, hängen Sie b+ und einen aus zwei Buchstaben bestehenden ISO 639-1-Sprachcode aneinander an. Optional können Sie weitere durch + getrennte Untertags hinzufügen.

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 zur 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 die arabische Sprache und ein generisches 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 (jede Sprache 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 sw<N>dp

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 Qualifizierer können Sie dafür sorgen, dass Ihre App mindestens <N> dps Breite für die Benutzeroberfläche zur Verfügung hat.

Wenn für Ihr Layout beispielsweise erforderlich ist, dass die kleinste Dimension des Bildschirmbereichs immer 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. Dabei spielt es keine Rolle, 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 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 Schlüsselfaktor bei der Entscheidung, ob für Smartphones ein Layout mit einem Bereich oder für Tablets ein Layout mit mehreren Bereichen verwendet werden soll. Daher ist es wahrscheinlich am wichtigsten, die kleinste mö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 (Smartphone)
    • 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-Wert dem smallestWidth-Wert des Geräts am nächsten kommt, ohne ihn zu überschreiten.

Hinzugefügt in API-Level 13.

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 Erstellen von Designs für verschiedene Bildschirme mit diesem Qualifier finden Sie unter Responsives/adaptives Design mit Ansichten.

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 (in dp-Einheiten, die durch den Wert <N> 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 Ausrichtung des Geräts zwischen Hoch- und Querformat ändert, das Gerät zusammen- oder aufgeklappt wird oder das System in den oder aus dem Mehrfenstermodus wechselt. 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 soll in der Regel nicht dasselbe Layout mit mehreren Bereichen für die Hochformat- wie für die Querformatansicht verwendet werden. So können Sie damit die für das Layout erforderliche Mindestbreite und/oder ‑höhe angeben, anstatt sowohl die Qualifizierer für Bildschirmgröße als auch für 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 Statusleiste des Smartphones, 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, in der beide angegeben sind, einer Ressource vorzuziehen, in der nur eine der beiden angegeben ist. 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.

Hinzugefügt in API-Level 13.

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

Weitere Informationen zum Erstellen von Designs für verschiedene Bildschirme mit diesem Qualifier finden Sie unter Responsives/adaptives Design mit Ansichten.

Displaygröß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 eine ähnliche Größe wie ein HVGA-Bildschirm 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 eine ähnliche Größe wie ein VGA-Bildschirm 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. Hinzugefügt in API-Level 9.

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 angeben, die besser zur aktuellen Gerätekonfiguration passen, kann das System die Ressourcen verwenden, die am besten passen.

Achtung:Wenn für alle Ihre Ressourcen ein Größenqualifizierer verwendet wird, der größer als der aktuelle Bildschirm ist, werden sie vom System nicht verwendet 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 Displays 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.

Weitere Informationen finden Sie unter isScreenRound()-Konfigurationsmethode. Dort wird angegeben, 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

In API-Level 26 hinzugefügt.

Weitere Informationen finden Sie unter isScreenWideColorGamut()-Konfigurationsmethode, in der angegeben wird, 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

In API-Level 26 hinzugefügt.

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 einer Autohalterung 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, von dem der Nutzer weit entfernt ist. Die Interaktion erfolgt hauptsächlich über das Steuerkreuz oder andere Methoden ohne Zeiger.
  • 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; Smartwatch hinzugefügt in API 20.

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 während der Lebensdauer Ihrer App ändern, wenn der Nutzer das Gerät in eine Dockingstation 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 Automatikmodus (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 extra-extra-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. Es ist hauptsächlich für Fernseher mit 720p gedacht und wird von den meisten Apps nicht benötigt. Verwende für 1080p-TV-Panels xhdpi und für 4K-TV-Panels xxxhdpi. Hinzugefügt in API-Level 13.
  • anydpi: Entspricht allen Bildschirmdichten und hat Vorrang vor anderen Qualifizierern. Dies ist nützlich für Vektordrawables. In API-Level 21 hinzugefügt.
  • nnndpi: Wird verwendet, um nicht standardmäßige Dichten darzustellen, wobei nnn eine positive Ganzzahl für die Bildschirmdichte ist. 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 Dichte-Qualifizierers 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 die beste Übereinstimmung aufweisen.

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 nur verwendet, wenn eine Hardwaretastatur verfügbar ist.
  • keyshidden: Auf dem Gerät ist eine Hardwaretastatur verfügbar, sie ist jedoch ausgeblendet 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 bereitstellen, verwendet das System die keysexposed-Ressourcen, unabhängig davon, ob eine Tastatur sichtbar ist, sofern das System eine Softwaretastatur aktiviert hat.

Das kann sich im Laufe 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 Hardware-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.

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.

Hinweis:Nicht alle Android-Versionen unterstützen alle Qualifizierer. Wenn Sie einen neuen Qualifier verwenden, wird der Qualifier für die Plattformversion implizit hinzugefügt, damit er von älteren Geräten ignoriert werden kann. Wenn Sie beispielsweise den Qualifizierer w600dp verwenden, wird automatisch auch der Qualifizierer v13 eingeschlossen, da der Qualifizierer „available-width“ erst ab API-Level 13 verfügbar ist. Um Probleme zu vermeiden, sollten Sie immer eine Reihe von Standardressourcen (Ressourcen ohne Qualifizierer) angeben. Weitere Informationen finden Sie im Abschnitt Beste Gerätekompatibilität mit Ressourcen.

Regeln für Namen von Qualifizierern

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

  • Sie können mehrere Qualifizierer für eine 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 in 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 mit diesen Qualifizierern gespeichert haben, 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 ermittelt dann die am besten passende Ressource.

Wenn es keine alternativen Ressourcen gibt, die einer bestimmten Gerätekonfiguration entsprechen, verwendet Android die entsprechenden Standardressourcen – 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 einem alternativen Ressourcenverzeichnis ablegen. Stattdessen können Sie eine alternative Ressource erstellen, die als Alias für eine Ressource dient, die in Ihrem Standardressourcenverzeichnis gespeichert ist.

Hinweis:Nicht für alle Ressourcen ist ein Mechanismus verfügbar, mit dem Sie einen Alias für eine andere Ressource erstellen können. Insbesondere Animationen, Menüs, Rohdaten und andere nicht angegebene Ressourcen im Verzeichnis xml/ bieten diese Funktion nicht.

Angenommen, Sie haben ein App-Symbol, icon.png, und benötigen eine eindeutige Version davon für verschiedene Sprachen. Für die beiden Gebietsschemas „Englisch (Kanada)“ und „Französisch (Kanada)“ muss jedoch dieselbe Version verwendet werden. Sie müssen dasselbe Bild nicht für Englisch-Kanada und Französisch-Kanada in das Ressourcenverzeichnis 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 Zeichnung 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.

Strings und andere einfache Werte

Wenn Sie einen Alias für einen vorhandenen String erstellen möchten, verwenden Sie die Ressourcen-ID des gewünschten Strings als Wert für den neuen String:

<?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 R.string.hello.

Andere einfache Werte funktionieren auf dieselbe 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 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 zeichnungsfähigen Ressourcen. 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 des XML-Attributs 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 Unterklasse 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 Über Code auf Ressourcen 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 Über XML auf Ressourcen 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 für ein ImageView die Ressource res/drawable/myimage.png 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. Eine Instanz davon erhalten Sie mit getResources().

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.

Weitere Informationen zu den einzelnen Ressourcentypen und dazu, wie Sie auf sie verweisen, finden Sie unter Übersicht über Ressourcentypen.

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

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

Über XML auf Ressourcen zugreifen

Sie können Werte für einige XML-Attribute und -Elemente mithilfe eines Verweises 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. Dies ist nicht erforderlich, wenn Sie auf Ressourcen aus demselben 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.

Weitere Informationen zu den einzelnen Ressourcentypen und dazu, wie Sie auf sie verweisen, finden Sie unter Übersicht über Ressourcentypen.

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. Wenn Sie beispielsweise die folgende Ressourcendatei mit einer Farbressource und einer String-Ressource haben:

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

Hinweis:Verwenden Sie immer String-Ressourcen, damit Ihre Anwendung für andere Sprachen lokalisiert werden kann. Informationen zum Erstellen alternativer Ressourcen (z. B. lokalisierter Strings) finden Sie unter Alternative Ressourcen bereitstellen. Eine vollständige Anleitung zur Lokalisierung Ihrer Anwendung für andere Sprachen finden Sie unter App lokalisieren.

Sie können sogar Ressourcen in XML verwenden, um Aliase 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 redundant, kann aber sehr nützlich sein, wenn Sie eine alternative Ressource verwenden. Weitere Informationen finden Sie im Abschnitt Aliasressourcen erstellen.

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 Theme definiert ist.“

Um auf ein Stilattribut zu verweisen, ist die Namenssyntax fast identisch mit dem normalen Ressourcenformat. Anstelle des „at“-Symbols (@) wird jedoch ein Fragezeichen (?) verwendet. Der Teil für den Ressourcentyp ist optional. Die Referenzsyntax lautet also so:

?[<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 Theme 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 Tool für Systemressourcen 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

In seltenen Fällen müssen Sie möglicherweise auf Ihre Originaldateien und ‑verzeichnisse zugreifen. 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, Themes 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 Layoutressource, die von der Plattform für Elemente in einer ListView definiert wird. 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, in der sie angezeigt wird, nicht versteht. Besser als ein Absturz.

Wenn Sie unterschiedliche 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 auf einer Konfiguration ausgeführt wird, die Sie nicht erwartet haben, sondern auch, weil in neuen Android-Versionen manchmal Konfigurationsqualifizierer hinzugefügt werden, 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 ab, wenn sie auf einer älteren 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 Drawableressourcen 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.

So findet Android die am besten passende Ressource

Wenn Sie eine Ressource anfordern, für die Sie Alternativen angeben, wählt Android zur Laufzeit die zu verwendende alternative Ressource aus, je nach aktueller Gerätekonfiguration. Um zu veranschaulichen, wie Android eine alternative Ressource auswählt, nehmen wir an, 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/

Angenommen, die Gerätekonfiguration ist wie folgt:

Sprache = en-GB
Bildschirmausrichtung = port
Bildschirmdichte = hdpi
Touchscreen-Typ = notouch
Primäre Methode zur Texteingabe = 12key

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

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

Abbildung 2: Flussdiagramm, das zeigt, wie Android die am besten passende 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 Pixeldichte des Displays ist der einzige Qualifikator, der nicht aufgrund eines Widerspruchs entfernt wird. Obwohl die Bildschirmdichte des Geräts „hdpi“ ist, wird drawable-port-ldpi/ nicht entfernt, da zu diesem Zeitpunkt jede Bildschirmdichte als Übereinstimmung betrachtet wird. Weitere Informationen finden Sie unter Bildschirmkompatibilität – Übersicht.

  2. Suchen Sie in der Liste (Tabelle 2) nach dem Qualifikator mit der nächsthöheren Priorität. Beginnen Sie mit dem Verwaltungskonto.
  3. Ist dieser Qualifier in einem der Ressourcenverzeichnisse enthalten?
    • Falls nicht, kehren Sie zu Schritt 2 zurück und sehen Sie sich den nächsten Qualifikator an. In diesem Beispiel lautet die Antwort „Nein“, bis der Sprachqualifikator erreicht ist.
    • Wenn ja, fahren Sie mit Schritt 4 fort.
  4. Entfernen Sie Ressourcenverzeichnisse, die diesen Qualifier nicht enthalten. Als Nächstes werden alle Verzeichnisse ohne Sprachqualifizierer entfernt:
    drawable/
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

    Ausnahme:Wenn der betreffende Qualifier die Pixeldichte des Displays ist, wählt Android die Option aus, die der Displaydichte des Geräts am ehesten entspricht. Im Allgemeinen wird unter Android ein größeres Originalbild lieber verkleinert als ein kleineres Originalbild vergrößert. Weitere Informationen finden Sie unter Bildschirmkompatibilität – Übersicht.

  5. Wiederholen Sie die Schritte 2, 3 und 4, bis nur noch ein Verzeichnis übrig ist. In diesem Beispiel ist die Bildschirmausrichtung der nächste Qualifikator, für den es Übereinstimmungen gibt. Ressourcen, für die keine Bildschirmausrichtung angegeben ist, werden also entfernt:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    Das verbleibende Verzeichnis ist drawable-en-port.

Dieses Verfahren wird zwar für jede angeforderte Ressource ausgeführt, das System optimiert jedoch einige Aspekte. Eine solche Optimierung besteht darin, dass alternative Ressourcen, die niemals übereinstimmen können, eliminiert werden, sobald die Gerätekonfiguration bekannt ist. Wenn die Konfigurationssprache beispielsweise Englisch ist, wird jedes Ressourcenverzeichnis, für das ein Sprachqualifizierer auf eine andere Sprache als Englisch festgelegt ist, nie in den Pool der geprüften Ressourcen aufgenommen. Ein Ressourcenverzeichnis ohne den Sprachqualifizierer wird jedoch weiterhin berücksichtigt.

Wenn das System Ressourcen anhand der Qualifizierer für die Bildschirmgröße auswählt, werden Ressourcen verwendet, die für einen kleineren Bildschirm als den aktuellen Bildschirm entwickelt wurden, wenn es keine Ressourcen gibt, die besser passen. Auf einem großen Display werden beispielsweise bei Bedarf Ressourcen für Displays in normaler Größe 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 ist beispielsweise der Fall, wenn alle Layoutressourcen mit dem Qualifikator xlarge getaggt sind, das Gerät aber einen Bildschirm normaler Größe hat.

Hinweis:Die Priorität des Qualifizierers (in Tabelle 2) ist wichtiger als die Anzahl der Qualifizierer, die genau mit dem Gerät übereinstimmen. Im vorherigen Beispiel enthält die letzte Auswahl in Schritt 4 drei Qualifizierer, die genau mit dem Gerät übereinstimmen (Ausrichtung, Touchscreen-Typ und Eingabemethode), während drawable-en nur einen übereinstimmenden Parameter hat (Sprache). Die Sprache hat jedoch eine höhere Priorität als diese anderen Qualifizierer. Daher wird drawable-port-notouch-12key ausgeschlossen.