Das magische R im Android SDK

Im Android-SDK wird die Variable R benutzt, um Ressourcen einzubinden. Es gibt dabei zwei unterschiedliche Arten von R. Zum einem das R der Android-Bibliothek (import android.R) und zum anderen das R für die eigenen Ressourcen.

Eigene Ressourcen werden im Projektordner „/res“ abgelegt. Dabei gibt es ein vordefiniertes Schema. Dateien für XML-Layouts liegen in „/res/layout/name_der_datei.xml“. Eine solche Datei kann dann in der Entwicklungsumgebung mit „R.layout.name_der_datei“ angesprochen werden. Dies funktioniert aber nur, wenn das „lokale“ R benutzt wird (und nicht „import android.R“). Manche Programmierumgebungen registrieren das lokale R aber nicht automatisch, weshalb man hier nachhelfen muss.

Wenn in einer Klasse eine lokale Ressource verwendet soll, dann muss im Paket dieser Klasse auch eine Datei namens „R.java“ vorhanden sein. In dieser Datei werden eindeutige IDs für jede Ressourcen-Variable (z.B. „name_der_datei“) festgelegt.

Für das genannte Beispiel würde die Datei „R.java“ wie folgt aussehen:

1
2
3
4
5
6
7
8
9
package de.bennyn.testprojekt;
 
public final class R
{
    public static final class layout
    {
        public static final int name_der_datei=0x7f030000;
    }
}

Hätten wir noch die Standard-Layout-Datei „/res/layout/main.xml“ und die Standard-Textdatei „/res/values/strings.xml“, dann müsste „R.java“ so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package de.bennyn.testprojekt;
 
public final class R
{
    public static final class layout
    {
        public static final int name_der_datei=0x7f030000;
	public static final int main=0x7f030001;
    }
 
    public static final class string
    {
        public static final int string_variable=0x7f050000;
    }
}

Die hexadezimalen IDs sind frei wählbar. Man hätte wahrscheinlich erwartet, dass die Datei „strings.xml“ der Klasse „values“ (innerhalb von R) angehören müsste. Das ist aber falsch, weil sich die Klassenbezeichnung nicht nach den Ordner -oder Dateinamen richtet, sondern nach dem Typ der Variablen. In diesem Fall ist in „strings.xml“ eine String-Variable mit dem Namen „string_variable“ definiert.

Hinweis: Allgemein gilt, dass man die R.java nicht selber erstellen und manipulieren sollte. Die automatische Erstellung (z.B. mit dem aapt tool) hat hier Vorrang. Trotzdem ist es gut, den Hintergrund zu kennen, falls man doch einmal eingreifen muss.

2 Gedanken zu „Das magische R im Android SDK“

  1. Top Erklärung, genau danach habe ich gesucht – vor allem mit Beispiel! 🙂
    Bin momentan dabei einen Android Studio-Guide durchzuforsten, bei dem manches leider nur sehr bruchstückhaft, bzw teils kryptisch, weil manchmal ohne Beispiel, erklärt wird.
    Danke für das Licht im Dunkeln!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.