it-swarm.com.de

Was ist das Konzept hinter R.java?

In Android wird R.Java verwendet, um den Zugriff auf in XML-Dateien definierte Ressourcen zu ermöglichen. Um auf die Ressource zuzugreifen, müssen wir die Methode findViewById() aufrufen und die ID der abzurufenden Ressource übergeben.

Dies ähnelt Spring, wo Beans in einem XML-Kontext definiert und mithilfe des Anwendungskontexts abgerufen werden. context.getBean("beanId")

Dies sorgt für eine lose Kopplung, da die Beans extern definiert sind und geändert werden können, ohne den Code zu ändern.

Das hat mich verwirrt. Obwohl das, was Android macht, dem Frühling ähnlich sieht, welchen Vorteil bietet es?

  1. Was bringt es überhaupt, einen fortgeschrittenen R.Java zu haben? Könnten wir nicht einfach Ressourcen direkt aus XML mit einem Ressourcen-Reader/Anwendungskontext abrufen? z.B. findViewById("resourceId")
  2. Es gibt keine lose Kupplung. Da Referenzen in R.Java automatisch generiert werden, wie kann man eine Ressource löschen und eine neue hinzufügen?
  3. Welchem ​​Entwurfsmuster folgt es (falls vorhanden)?
  4. Wäre es nicht besser, Ressourcen mithilfe von IOC (wie Roboguice) injizieren zu lassen? Warum hat sich Google dann dazu entschlossen, uns eine so verrückte Art der Arbeit mit Ressourcen zu bieten?

Verzeihen Sie meine Unwissenheit. Ich bin ein Java-Neuling, der zu viele Dinge auf einmal versucht. :-) Danke für all das Feedback.

36
Monika Michael

Android.R.Java ist nicht nur der Ort, an demXMLids gespeichert sind. Es enthält auch Zugriff auf Ressourcen - wie Zeichenobjekte, Layouts, Zeichenfolgen, Arrays und im Wesentlichen alles, was Sie in Ressourcen deklarieren können.

Ich persönlich finde, dass es bei der Verwendung von Eclipse nützlich ist. Ich kann einfach findViewById(R.id. eingeben, und Eclipse zeigt eine QuickInfo mit einer Liste von Optionen zur Auswahl an. 

Auf Plattformebene würde ich jedoch sagen, dass die hartcodierten id-Variablen Fehler bei der Verwendung von Strings zum Erkennen von Ressourcen verhindern - etwas, das während der Programmierung (oder während der Kompilierung und nicht während der Laufzeit) debugbar sein kann.

19
Phil

Der größte Vorteil besteht in der Lokalisierung und in der Bereitstellung alternativer Ressourcen für verschiedene Bildschirmgrößen.

sie können beispielsweise eine String-Ressource R.string.myname haben. Dies könnte in Englisch in /values-en/strings.xml und in Spanisch in /values-es/strings.xml definiert sein.

Das System kümmert sich um das Auffinden der richtigen Datei, je nachdem, welches Gebietsschema Sie lediglich @string/myname in Ihrer Layoutdatei oder R.string.myname in Ihrem Code verwenden müssen.

Ebenso können Sie zwei Layout-Dateien für Hoch- und Querformat definieren

res/layout/mylayout.xml
res/layout-land/mylayout.xml

In Ihrem Code geben Sie einfach R.layout.mylayout an, um das Layout aufzublasen. Der Ressourcenmanager Nimmt die Datei im Layout-Land auf, wenn sich das Gerät im Querformat befindet.

Dies manuell zu tun wäre ein Albtraum - daher die Notwendigkeit einer R-Datei 

21
Rajdeep Dua

Der Vergleich fühlt sich an etwas ein bisschen (eigentlich) komisch, weil Sie zwei Mechanismen vergleichen, die auf der Tatsache basieren, dass sie benannte Dinge verwenden, um Dinge zu tun. Sehen Sie sich zum Laden von Ressourcen beispielsweise an, wie die Ressourcenbehandlung in der .Net-Welt erfolgt.


Es sorgt dafür, dass Kompilierzeit überprüft wird, ob die Ressource verfügbar ist. Wenn dies nicht der Fall ist, gibt es in R.Java keine statischen Werte, die darauf zeigen. Wie können Sie im Spring-Beispiel sicher sein, dass es eine Bean namens beanId gibt? Es kann jedoch nicht geprüft werden, ob es sich um die richtige Ressource type handelt.

Warum ist das nicht locker? Solange die neue Ressource denselben Namen hat, generiert sie dieselbe statische Konstante. Im Frühling müssten Sie denselben Bohnennamen verwenden.

Design Pattern? Keiner. Es fügt nur eine Ebene der Indirektion hinzu, indem die Ressourcen benannt werden und dann auf sie verwiesen wird nur durch den Namen , nicht durch direktes Laden von ihrer tatsächlichen Position.

Eigentlich sind die Ressourcen are injiziert, da das Laden von Ressourcen mit der Lokalisierung fertig werden muss. Sehen Sie hier , wie Android Sachen macht; In der .Net-Welt werden zusätzliche Kulturen in Satellitenaggregate verpackt. Der Ressourcenmanager lädt den richtigen, basierend auf der aktuellen Kultur.

1
Stefan Hanke

Es enthält auch Zugriff auf Ressourcen - z. B. IDs, Drawables, Layouts, Strings, Arrays und im Wesentlichen alles, was Sie in Ressourcen deklarieren können.

0
mass