wake-up-neo.net

Android Studio 3.1.3 - Ungelöster Verweis: R - Kotlin

Ich bin neu bei Kotlin, ich habe etwas Code von Java konvertiert, aber es scheint, als wäre da etwas nicht in Ordnung. Ich habe nach einer Lösung gesucht, aber ich scheine es nicht herauszufinden. Was soll ich tun? Hier ist ein Screenshot:

 enter image description here

15

Das Problem kann durch viele Faktoren verursacht werden,

  • wie in diesem Artikel von martomstom erwähnt Antwort Das Problem wird manchmal durch die Version com.Android.tools.build:gradle verursacht. Wenn Sie die Version auf eine stabilere Version ändern, wird das Problem behoben: Zum Beispiel: com.Android.tools.build:gradle:3.4.0-alpha02 mit com.Android.tools.build:gradle:3.2.1
  • Außerdem können Bibliotheken aus derselben Gruppe, jedoch mit unterschiedlichen Versionen, das Problem oder noch mehr Laufzeitfehler verursachen. Verwenden Sie die Methode "Gruppe ausschließen" wie folgt: implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.Android.support') } In diesem Fall verwendet die Picasso-Bibliothek Android.support-Komponenten. Die in Picasso verwendete Bibliotheksversion Android=) unterscheidet sich von der von Ihnen wird derzeit in Ihrer App verwendet. Um dieses Problem zu beheben, müssen wir es vollständig aus der Unterbibliothek und den Klassengruppen ausschließen.

  • Es kann auch vorkommen, dass Ressourcen und Code nicht übereinstimmen. Wenn Sie diese Importzeile in Ihre Aktivität aufnehmen, kann das Problem möglicherweise auch behoben werden: import com.package.name.R

  • Manchmal kann es aufgrund der IDE, der Leistung oder des Arbeitsspeichers passieren. Wenn Sie das Projekt von Zeit zu Zeit bereinigen, können Sie Zeit sparen. In Android= Studio wäre es ungefähr so: Build -> Clean Project / Rebuild Project - Reinigung IDE Geld hilft auch bei Leistung und Speicher, auf Android = Studio sieht es so aus: File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
  • Ich habe festgestellt, dass dieses Problem die meiste Zeit beim Importieren neuer Ressourcen auftritt. Die Verwendung unzulässiger Zeichen in ihren Namen würde den Fehler auslösen, z. B. . , , - , UpperCase or special Letters.
  • Und als Vorschlag, wenn Sie Kotlin verwenden, empfehle ich wirklich die Verwendung von Kotlin-Erweiterungen in Ihrer Aktivität wie: import kotlinx.Android.synthetic.main.activity_page.* Oder Wenn Sie eine benutzerdefinierte Ansicht verwenden: kotlinx.Android.synthetic.main.view_layout.view.* Danach haben Sie in der onCreat () -Methode einer Aktivität nur noch Um die ID aufzurufen, zum Beispiel: my_edit_text_ID.text = "Kotlin Dbest!" oder in einer benutzerdefinierten Ansicht: mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

EDIT:

  • Ich habe mich erneut mit diesem Problem befasst und das Problem war, dass die Bibliothek '' R '' aus zwei verschiedenen Quellen importiert wurde:

    com.Android.R

    com.example.package.R

    Sie müssen nur die Bibliothek '' R '' mit Ihrem Anwendungspaketnamen importieren, in diesem Fall com.example.package.R. Manchmal wird die Bibliothek überhaupt nicht importiert. Klicken Sie zum Importieren auf die nicht aufgelöste Referenz R. und drücke Alt + Enter

18
Tamim Attafi

Ich habe com.Android.tools.build:gradle:3.3.0-alpha13 verwendet und hatte das gleiche Problem. Der Wechsel zur stabilen Version 3.2.1 hat dieses Problem für mich gelöst.

22
martomstom

Das ist also ein irreführender Fehler. 

Ich werde die 30.000 Fuß-Ansicht von dem erläutern, was passiert. Dies ist weder eine exakte Reihenfolge noch ein exakter Ablauf, es ist einfach verdammt nah;) Wenn Sie also mehr wissen, dann mache ich die genaue Reihenfolge und sorge mich dafür, Korrekturen mit Links vorzunehmen. Fühlen Sie sich frei.

Der Prozess

Die R-Datei wird Code generiert. 

Es gibt eine Ordnung für die Generation.

Gradle wird es magisch machen, seine Abhängigkeiten ziehen und loslegen Warnungs- und Fehlerbaum zuerst, 

dann konvertiert Android alles Kotlin hinter den Kulissen in Java. Ja, das ist Richtig, unser geliebter Kotlin muss noch Java sein, um für unser .__ zu kompilieren. beliebte virtuelle Maschine von ART. 

Dann läuft es durch und führt die Adapter aus, die Sie für .__ erstellt haben. JVM-Statik und einige andere Aufgaben . Als Nächstes werden alle XML-Datenbindungsdateien kompiliert, um die .__-Datei zu erstellen. generierte Datenbindungsdateien. 

Wenn alles erfolgreich ist, werden die Assets und .__ verarbeitet. Ressourcen. Dadurch werden Zeiger oder IDs für jede Ressource erstellt, die Sie Referenz im Code. Als nächstes wird es durchlaufen und mit dem Kompilieren von .__ beginnen. Code und Verpackungsprozess danach.

Ziemlich direkter Prozess, aber hier liegt das Problem.

Der irreführende Fehler

Wenn ein Schritt fehlschlägt, bevor die R-Generierung abgeschlossen ist, wird der R nicht generiert. Manchmal reicht eine einfache Neuerstellung aus, manchmal nur ein einfacher File-> Invalidate Cache and Restart. In der Regel haben Sie jedoch ein Codeproblem in Ihrem Gradle, in Ihrer XML-Datei, in Ihrer Datenbindung oder in Ihren Adaptern, die den Compiler daran hindern, die Stufe der R-Generierung zu erreichen.

Die nächste Frage ist also  

"Nun schießen, wie können wir es beheben, wenn die Fehler wertlos sind oder Nicht vorhanden ist".

Lassen Sie uns zuerst über die vielen Möglichkeiten sprechen, die diese Fehler darstellen. 

  • Doppelte Datenbindungsklasse gefunden
  • xML-Bindungsfehler in Zeile #
  • Die übereinstimmende Signatur von bind konnte nicht gefunden werden: customAdapterMethod
  • R-Datei des richtigen Projekts kann nicht gefunden werden. Es werden nur Importoptionen für Untermodule oder falsche R-Dateien des Namespaces angezeigt.
  • DataBindingUtility oder DataBinding für Aktivität/Fragment konnte nicht gefunden werden
  • Und viele andere Möglichkeiten, zu viele, um sie alle aufzulisten

Als nächstes wollen wir über mögliche Kandidaten sprechen, die das Problem verursachen. Da gibt es sooo viele Lol.

  • Gradle Probleme beim Synchronisieren 
  • Caching-Probleme (Datei-> Neustart und Ungültigmachen des Caches)
  • xML-Elemente mit falschem Namespace
  • xML-Elemente mit ungültigen IDs oder Referenz-IDs außerhalb der Reihenfolge (d. h., Sie sagen, dass die Ausrichtung eines Elements, das niedriger im XML-Dokument ist, als das Schwesterelement, das versucht, darauf zu verweisen, rechtsbündig ausgeführt wird)
  • xML-Datenbindungsprobleme, die auf einen Namespace oder ein Member verweisen, das nicht vorhanden ist oder nicht richtig eingegeben wurde
  • xML-Datenbindungsprobleme in nicht automatisch ausgefüllten Stellen wie benutzerdefinierte Attribute, die Adapter verwenden, da diese schwerer zu erkennen sind. also bind: myCustomMethod = @ "myObject.mistypedProperty ()"
  • JVM Statische Adapter mit Problemen oder doppelten Signaturen
  • Dupliziertes oder falsches Zeichen in der Strings- oder Dimens-Datei oder einer anderen XML-Datei für diese Angelegenheit
  • Private Variable, die für @Binding ohne Eigenschaften für den Zugriff darauf markiert ist
  • Für @Binding markierte Membervariable, die mit einer übergeordneten Klassenmethode übereinstimmt und Doppelungen verursacht, die sich in fast unmöglichen Fehlern äußern
  • Unstimmigkeiten bei Typen, z. B. die Verwendung eines Adapters, der (Int) verwendet, aber Sie (Int?) Über Datenbindung übergeben, und er wird von JVM Statics bis zur Kompilierzeit nicht erkannt
  • Sie haben IMPORT in einem Popup ausgewählt, um die R-Datei eines Untermoduls anstelle der Anwendungsdatei zu importieren
  • Bindbare Mitglieder in einer untergeordneten oder übergeordneten Klasse haben, der Klassenumwandlung jedoch in der XML-Verwendung der übergeordneten oder untergeordneten Klasse kein vollständig qualifizierter Namespace zugewiesen wird. Da der Compiler für die Datenbindung nicht intelligent genug ist, um die für die Klasse Foo bereitgestellte Variable auch als parentFoo-Baseclass zu erkennen, müssen Sie sie als Android qualifizieren: text = "@ ((com.path.parentFoo) foo) .parentMethod"
  • Einen Methodennamen in einer Klasse haben, der mit einer "generierten Eigenschaft von @Binding-Membervariable" übereinstimmt, dh firstName als Variable, dann aber eine Methode mit dem Namen getFirstName in einer übergeordneten oder untergeordneten Klasse, da Sie jetzt mit einem Methodennamen übereinstimmen wird automatisch generiert, wodurch dataBindingUtility-Fehler bei der Duplizierungsklasse verursacht werden.
  • Es gibt mehr Ursachen, aber dies sollte Ihnen eine Reihe von Orten bieten, die Sie suchen können, aber die Liste kann ernsthaft weitergehen.

Unglücklicherweise geschieht dies häufig bei der Technologie "Bleeding Edge", bei der die UI-Tools noch nicht mit den auf Terminals basierenden Tools auf dem neuesten Stand sind. Also ich schlage vor, Sie laufen vom Projektstamm aus in ein Terminal mit

bash gradlew assembleRelease --debug

Wenn es versagt, und es wird. Beginnen Sie, durch die Protokolle zu scrollen, bis Sie den roten Punkt sehen, an dem Sie sehen, was tatsächlich fehlgeschlagen ist, und verhindern Sie, dass die nächste Stufe auftritt.

Sie werden dies besonders nützlich finden, wenn Sie mit dem Datenbinden beginnen. TIPP: .

Wenn Sie sich mit dem Datenbinden befassen, stellen Sie sicher, dass Sie häufig kompilieren und ausführen, da das Ziel darin besteht, sofort zu erkennen, bevor Sie andere Dateien verwenden, um sicherzustellen, dass Sie die Generierung nicht unterbrochen haben und Ihr Leben um vieles viel einfacher zu wissen, was Sie gerade verursacht haben bevor es zu weit geht.

Zeit zum Kompilieren und Ausführen, um keine Probleme zu bestätigen, bevor Sie fortfahren. 

.

  • Wenn Sie Ihrem XML-Objekt Variablen hinzufügen, die verwendet werden sollen
  • Wenn Sie in einer Datei an die Eigenschaften Ihres Modells binden
  • Wenn Sie eine Bindung zu einer JVMStatic hinzufügen
  • Wenn Sie einem Modell bindbare Elemente oder Eigenschaften hinzufügen
  • Wenn Sie die beobachtbaren Elementvariablen oder -eigenschaften in untergeordnete oder Basisklassen umwandeln
  • Alle anderen XML- oder bindungsbezogenen Elemente, die den generierten Code beeinflussen können.
  • Wie oben erwähnt, besteht der Grund darin, zu vermeiden, dass so viele Änderungen vorgenommen werden, dass es zu einem Albtraum zur Fehlerbehebung wird, um einen generischen vagen, schrecklichen Fehler im Zusammenhang mit dem generierten Datenbindungscode zu finden. Ich bin mir sicher, dass sich die Tools verbessern werden, aber tun Sie sich erst einmal einen Gefallen, kompilieren Sie sie und führen Sie sie häufig aus, wenn Sie Elemente zum Thema Databinding ändern.

Glückliche Kodierung.

Happy Coding

5
Sam

Verwenden Sie Gradle-Befehle.
In Android Studio im rechten Menü:
Gradle -> :app -> Tasks -> build -> clean.
Danach Gradle -> :app -> Tasks -> build -> build

5
Fireworks

Ich hatte das gleiche Problem und versuchte nicht von Gradle 3.3 auf Gradle 3.2.1 herunterzusteigen. Stattdessen habe ich Android Studio auf Version 3.3 aktualisiert, was den Trick für mich gemacht hat ;-)

2
HasBert

Das hat bei mir funktioniert. Wie viel Arbeit das kostet, hängt davon ab, wie groß Ihr Projekt ist. Ich habe ein neues Projekt gestartet, die erforderlichen Module erstellt (XML, Kotlin, Farben, Zeichenfolgen usw.) und dann den Code aus den Modulen des alten Projekts in die Module des neuen Projekts kopiert. Das Kopieren von XML spart im Vergleich zur Neuerstellung der Benutzeroberfläche viel Zeit. Alles in allem dauert es eine Weile, aber ich habe viel mehr Zeit damit verbracht, den ungelösten Referenzfehler ohne ihn zu beheben.

0
Earl Whitney

Das Downgrade der Gradle-Version hat bei mir funktioniert.

Ich habe mich verändert :

Gradle-Version von: 4.10.4 bis 4.4.1

und Gradle Plugin Version von: 3.3.1 bis 3.1.3

0
Ankush Joshi

Ich habe Android Studio auf Version 3.3.1 aktualisiert und dieses Problem behoben.

0
dudukee

VERSUCHE DIES

Gehen Sie zur Datei content_main.xml und dort müssen Sie die Datei ändern

Android:id="@+id/??????"> Codezeile zu der ID, die Sie Ihrer Datei gegeben haben.

Ersetzen Sie das Fragezeichen ?????? durch den ID-Namen der zugehörigen Datei (WENN Sie die ID nicht kennen, wechseln Sie zur Design-Registerkarte am unteren Rand und klicken Sie auf das entsprechende Asset.

Auf der rechten Seite unter den Attributen finden Sie die ID, die Sie ihm zugewiesen haben .. Wenn sie leer ist, können Sie sie neu benennen, und Android Studio schreibt den Code.

Starten Sie dann Android Studio neu. Hoffe das wird helfen. Glückliche Kodierung.

0
PRANAY REDDY

Ich hatte das gleiche Problem mit R. Referenz ..__ Schließlich wurde Android Studio 3.3 veröffentlicht und mit 'com.Android.tools.build:gradle:3.3.0' wurde das Problem behoben!

0
Josue

Ich glaube, dass ich auf die wirkliche Antwort gestoßen bin (allerdings durch Zufall).

Ich hatte auch, als das OP meine KT-Datei an Position R. nicht finden konnte, sowie an anderen Klassen, die zufällig in Java sind. Was mir auffiel, war, dass es einen Unterschied zwischen den Dateinamen gab. Nachdem ich die Importanweisungen korrigiert hatte, um mit dem Fall des Pakets (aka, Ordner) übereinzustimmen, wurden die Fehler behoben.

0
Ken