Was ist die Klasse R in Android?

90

Wenn ich in AndroidStudio ein Projekt mit einer leeren Aktivität erstelle, wird der folgende Code in der MainActivity.javaDatei angezeigt:

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Dabei wird eine kryptische Klasse mit dem Namen Rverwendet. Was ist der Zweck dieser Klasse R?

Android Eve
quelle

Antworten:

117

Rist eine Klasse, die die Definitionen für alle Ressourcen eines bestimmten Anwendungspakets enthält . Es befindet sich im Namespace des Anwendungspakets .

Wenn Sie beispielsweise in Ihrem Manifest angeben, dass Ihr Paketname lautet com.foo.bar, wird eine RKlasse mit den Symbolen aller Ihrer Ressourcen in generiert com.foo.bar.R.

Es gibt im Allgemeinen zwei R Klassen, mit denen Sie sich befassen werden

  1. Die Rahmenressourcen in android.Rund
  2. Dein eigenes, in deinem Namespace

Es gestattet , Rdenn das steht für R ESSOURCEN, und es gibt keinen Punkt in Menschen - Typen etwas länger zu machen, vor allem , da es üblich ist , mit ziemlich langen Symbolnamen , nachdem es am Ende, das kann eine ganze Menge Linie Wrapper verursachen.

Hackbod
quelle
10
Nachdem ich alle Probleme gelöst und mit dem Buch fortgefahren habe, kann ich (aus dem Buch) hinzufügen: Dies ist eine automatisch generierte Dienstprogrammklasse , die Verweise auf die Ressourcen im Projekt enthält. Es wird "R-Klasse" genannt, weil es R.java heißt . Es wird von AAPT aus den im res- Ordner definierten Ressourcen generiert .
Android Eve
1
Was ist android.R?
Malwinder Singh
12
Es gibt einen Punkt, an dem die Leute etwas länger tippen: Es heißt sauberer Code und hat möglicherweise noch nicht alle erreicht. Ein-Buchstaben-Klassen, Erweiterungen und Variablen sind in einem lokalen Kontext möglicherweise in Ordnung, jedoch niemals global. Hässliche Namen wie diese führen zu überflüssigen Fragen wie diesen.
Brainray
23

Was ist R: Es ist nichts sehr Geheimnisvolles an R. Es ist nur eine Klasse, die viele statische Unterklassen hat, sie in Eclipse öffnet und einen Blick darauf wirft (es ist unter gen /).

Jedes Mitglied dieser Klasse ist eines von zwei Dingen: 1) statische Endklassen oder 2) statische Endzahlen, die in Bezug auf die anderen Mitglieder ihrer Klasse eindeutig sind.

Warum ist es so kryptisch: Es ist leicht zu verwirren, weil R automatisch von ant generiert wird. Es ist kryptisch, weil Sie es nicht manuell "berühren" sollen (natürlich können Sie es, aber Ihre Änderungen werden bei der Regeneration automatisch gelöscht). Es ist zusätzlich kryptisch, weil Eclipse manchmal automatisch Standard-R-Dateien von Androiden importiert (wie in den obigen Antworten beschrieben).

Warum ist es immer das erste, das nicht gelöst werden kann: R folgt genau den Regeln von Java-Klassen und -Paketen. Es gibt nichts Besonderes daran, wie sich R beim Import verhält. R wird automatisch in das Paket eingefügt, das durch den Paketeintrag in Ihrer Manifestdatei angegeben wird

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1">
    <uses-sdk android:minSdkVersion="13" />

Um zu sehen, zu welchem ​​Paket Ihre R-Datei gehört, öffnen Sie einfach den Ordner gen / in Eclipse (Paketansicht). Dort wird ein Paket aufgelistet, das den Namen hat, den Sie in Ihrem Manifest angegeben haben. Wenn Sie versuchen, es zu löschen, wird es wieder angezeigt, wenn alle Ihre Ressourcen den korrekten Namensregeln und alle Ihre XML-Dateien den korrekten XML-Regeln folgen und wenn die automatische Erstellung in Eclipse aktiviert ist.

Der Schlüssel zum Verständnis der R-Datei besteht darin, zu erkennen, dass sie sich im selben Paket wie die anderen Klassen befindet, obwohl sie sich in einem anderen Verzeichnis befindet als andere Dateien, die zu Ihrem "Haupt" -Paket gehören. Nachdem Sie dies verstanden und die Syntax und Benennung von Ressourcendateien verstanden haben, ist die Fehlerbehebung bei Problemen mit R einfach.

tjb
quelle
3

R ist der Name für Ihre Ressourcen. Jede Ressource, auf die Sie zugreifen, R.$FOLDER.$RESOURCEoder etwas sehr Ähnliches.

Wenn dies nicht behoben werden kann, stellen Sie sicher, dass der Pfad korrekt ist und die referenzierte Ressource vorhanden ist (Groß- und Kleinschreibung beachten; Erweiterung einschließen).

Der verwirrende Teil (für mich jedenfalls) ist auch, dass es zwei verschiedeneR gibt . Wenn Sie viele Fehler "Kann nicht behoben werden" erhalten, versuchen Sie zu sehen, was Sie importieren. Versuchen Sie es zu ändern oder zu entfernen. Oder Sie können versuchen, Ihr Projekt zu bereinigen (WARNUNG: Manchmal macht das die Dinge schlimmer als sie bereits sind).

John
quelle
Ja, das Reinigen meines Projekts scheint eine tägliche Routine zu sein - Eclipse geht immer durcheinander und vergisst Dinge, aber eine gute Reinigung scheint Dinge zu reparieren (obwohl ich noch nie erlebt habe, dass die Dinge schlimmer sind als sie bereits sind, wie John erwähnt). .
Brian D
@Brian: Wenn ich mein Projekt bereinige, zerstört und regeneriert Eclipse meine RDatei. Hin und wieder verfehlt es den Schritt "Regenerieren" und lässt mich ohne (oder mit einem leeren) Schritt Rund Rist so programmiert, dass alle von Hand vorgenommenen Änderungen automatisch rückgängig gemacht werden.
John
@ John: Welches Betriebssystem benutzt du, nur aus Neugier?
Brian D
@ John, Reinigung hilft in meinem Fall nicht. Sie können die aktuelle Liste der Fehler in diesem Thread sehen (der noch nicht beantwortet wurde): stackoverflow.com/questions/4928784/…
Android Eve
1

Android R.java ist eine automatisch generierte Datei von AAPT (Android Asset Packaging Tool), die Ressourcen-IDs für alle Ressourcen von res / directory enthält. Wenn Sie eine Komponente in der Datei activity_main.xml erstellen, wird die ID für die entsprechende Komponente automatisch in dieser Datei erstellt. Diese ID kann in der Aktivitätsquelldatei verwendet werden, um eine Aktion für die Komponente auszuführen.

Sahil
quelle