Datenbindungsklasse nicht generiert

94

Ich verwende die Datenbindung in meinem Projekt, wenn <layout>und <data>in meiner XML-Bindungsklasse keine generiert wird.

Zum Beispiel habe ich activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

Wenn ich jetzt ActivityMainBindingin meine Aktivität / mein Fragment schreibe , wird der Fehler angezeigt, dass die Klasse nicht verfügbar ist. Aber nachdem es <variable>in meine XML-Datei aufgenommen wurde, kann es eine ActivityMainBindingKlasse generieren .

Android Studio: 2.1.3 Klassenpfad
: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Ravi
quelle
2
ist dataBinding.enabledin deinem build.gradle?
Pskink
2
Ich denke, das ist ein bekannter Fehler. Sie können versuchen, Ihr Projekt zu erstellen, bevor Sie versuchen, darauf zuzugreifen ActivityMainBinding, oder es hat etwas mit diesem Fehler zu tun .
Yennsarah
@pskink ja, das ist es, deshalb generiert es Bindungsklasse nach dem Hinzufügen <variable>in xml
Ravi
@Amylinn nach dem Erstellen meines Projekts wird es generiert, aber meine Frage ist, wenn ich schreibe <variable>, generiert es Bindungsklasse ohne Projekt erstellen .
Ravi
Ah, in der Tat, ich habe das verpasst
pskink

Antworten:

212

Ich habe keine befriedigenden Antworten bekommen. Hier sind die Tipps, die eine Zusammenfassung meiner Datenbindungskenntnisse darstellen.

Tipps zum Lösen von DataBinding-Problemen

Aktualisieren

Um genauere Fehler und Vorschläge zu erhalten , empfehle ich dringend, die Android Studio- und Gradle-Plugin-Version auf den neuesten Stand zu bringen. Weil ich nach der AS 3.2-Version nicht viele Probleme habe.

Siehe Neuestes Android Studio und Neuestes Gradle-Plugin .

Ursprüngliche Lösung

Nachdem Sie diese Antwort gelesen haben, werden Sie nicht in Problemen mit der automatischen Datenbindung für Klassen und Datenvariablen stecken bleiben .

Überprüfen Sie diese Punkte nacheinander. All dies kann Ihre Arbeit erledigen. Punkt 3 bis zum letzten sind wirklich wichtig, also verpassen Sie sie nicht.

1. Überprüfen Sie, ob die Datenbindung aktiviert ist

Sie sollten Datenbindung aktiviert in build.gradle. Wenn nicht, fügen Sie dies hinzu und synchronisieren Sie .

android {
...
   dataBinding {
        enabled = true
    }
...
}

2. Überprüfen Sie, ob das Layout in das Bindungslayout konvertiert wurde

Nun , wenn Sie wollen Datenklasse verbindlich dann erzeugt werden , sollten Sie wickeln xml layoutmit Datenbindung ( <layouttag). Etwas wie das.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

Überprüfen Sie zusammen mit dieser Option, ob die Namen der Bindungsvariablen wie in der Ansichtsmodellklasse korrekt sind

3. Automatisch generierter Name der Bindungsklasse?

Ihre Datenbindungsklasse sollte nach dem Erstellen des Bindungslayouts generiert werden.

Wenn sich Ihr Layoutname im Fall einer Schlange befindet, wird die activity_main.xml Datenbindungsklasse in einem Fall wie in einem Kamel generiert ActivityMainBinding.

4. Importvorschlag nicht angezeigt?

Wenn Sie tippen ActivityMai..., wird manchmal kein Vorschlag angezeigt . In diesem Fall wird der Import manuell durchgeführt .

import <yourpackage>databinding.ActivityMainBinding;

5. Lesen Sie Build Fail Logcat

Ihre Bindungsklasse und neue Variablen im Layout werden nicht generiert, wenn Ihr Build fehlschlägt. Also zuerst Projekt erstellen mit Strg + F9 (Erstellen> Projekt erstellen) .

  • Wenn ein Build fehlschlägt, sehen Sie, was ein Fehler ist. In der Regel treten Fehler in den Layoutfeldern auf. Fehlerprotokolle weisen auf die Fehlerzeilennummer des Problems hin.
  • Die Bindung kann fehlschlagen und einen dummen Fehler verursachen , z. B. einen Syntaxfehler oder einen fehlenden Import. In diesem Fall erhalten Sie logcat voller Fehler von Bindungsklassen. Sie sollten jedoch den vollständigen Logcat lesen , um das entsprechende Problem zu finden .

6. Schließen und öffnen Sie das aktuelle Projekt

Ich mache das immer, weil es viel weniger Zeit braucht als Rebuild/ Makeproject.

  • Schließen Sie das Projekt über Datei> Projekt schließen
  • Seit kurzem wieder geöffnet

Beachten Sie, dass ich das Schließen und Öffnen aus der letzten Version bevorzuge, da dies viel weniger Zeit in Anspruch nimmt als das Wiederherstellen / Neustarten der IDE .

7. Projekt neu erstellen

Wenn immer noch Ihre Klasse nicht generiert wird. (Irgendwann, wenn wir eine Layoutdatei einfügen, passiert es). Erstellen Sie dann das Projekt neu aus Build> Rebuild( Nicht erstellen oder Projekt erstellen ). Es wird Ihre Datenbindungsklasse generiert. ( Wiederaufbau macht Magie für mich. )

8. Haben Sie das neueste Android Studio

Nach dem Update von AS auf Android Studio 3.2 hatte ich das Gefühl, dass viele Fehler bei der automatischen Generierung von Datenbindungen behoben wurden. Sie sollten also auch die neueste AS haben.

Lösung für <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

Wenn wir eine Variable in das Layout einfügen, wird normalerweise ein Getter und ein Setter davon erstellt. Und wir können binding.setItem(item);und verwenden binding.getItem();, aber wenn Sie diese Methoden nicht sehen können, lesen Sie die folgenden Informationen.

1. Schließen und öffnen Sie das aktuelle Projekt

Wenn Sie eine Datenvariable <variablein Ihrem Layout erstellt haben und deren Setter und Getter nicht in der Datenbindungsklasse angezeigt werden, schließen und öffnen Sie Ihr Projekt zuletzt.

2. Reinigen Sie das Projekt, nachdem Sie den Typ geändert haben

Wenn Sie den Typ einiger <variableElemente in Ihrem Layout geändert haben und sich der Getter-Setter-Typ nicht ändert, wird Clean project ( Build> Clean Project)

Letzte Worte

Wenn Ihre Bindungsklasse immer noch nicht generiert wird, haben wir unsere stärkste Waffe. - Starten Sie Android Studio neu: D.

  • Versuchen Sie zunächst einfach neu zu starten . Dies generiert nach dem Neustart immer Variablen meines Bindungslayouts.
  • Wenn es nicht funktioniert, dann Cache ungültig machen und neu starten .

Dies ist alles, was ich tue, um meine Datenbindungsfehler zu lösen. Wenn Sie weitere Probleme haben, können Sie diese hier kommentieren.

Khemraj
quelle
2
Wenn das Problem weiterhin besteht ... (8) Ungültig machen und neu starten ... wenn nicht behoben, (9) Ändern Sie dataBinding {enabled = false} ... build und dann dataBinding {enabled = true} erneut erstellen ....
PravyNandas
1
In meinem Fall musste ich den Klassenpfad aus irgendeinem Grund manuell importieren. Die IDE zeigt dies nicht als Lösung an. Tnx :)
Ivan Kaloyanov
2
Hat meinen Tag gerettet. Mir fehlte die <Layout> -Verpackung in meiner Layoutdatei. Danke dir!
Juliano
Sie können auch hinzufügen, dass "import android.R" entfernt werden muss, wenn es Teil der Importliste ist. Dies löste mein Problem mit ungelöstem Verweis auf die Aktivitäts-XML-Datei
Tim John
23

DataBinding-Klasse wird automatisch generiert.

Wenn Ihr XML-Name activity_test lautet, lautet die Bindungsklasse ActivityTestBinding.

aber,

dataBinding {
        enabled = true
    }

Layout sollte Layout als root haben

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>
ViramP
quelle
Ich bin stundenlang auf der Suche nach Soultion, mache viel Gradle-Magie, aber ich benutze sie ConstraintLayoutals Wurzel. Danke dir!
Alexey Markov
14

Ich hatte das gleiche Problem. Nach dem Lesen der Android SDK-Dokumente muss nur der erwartete Dateiname erstellt werden, aber nichts darüber, was zu tun ist, wenn dies nicht der Fall ist. Nach einigen weiteren Recherchen stellte ich fest, dass es nach dem Entfernen des Namespace zum Layoutelement wie unten (anhand Ihres Beispiels) für mich funktioniert hat.

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 
ngaspama
quelle
10

In meinem Fall wurde die Bindungsklasse generiert und vorhanden (aber ich dachte, dass dies nicht der Fall ist) ... aber sie fügt den Import dieser Klasse nicht automatisch zum Aktivitäts- / Fragmentimportabschnitt hinzu ... also ... OPTION + EINGEBEN :)

Krzysztof Kubicki
quelle
2
Bingo hat für mich funktioniert, obwohl ich den Import manuell eingeben musste, bot Intellisense aus irgendeinem Grund keine Option an.
Rob
8

Nachdem ich es richtig eingerichtet hatte (einschließlich XML-Namespace und Einpacken in alles <layout>), war das, was für mich funktionierte, Build -> Make project. Weder Clean Project noch Rebuild Project haben dies getan. Ich bin in Android Studio 2.3.1 und verwende 26.0.2 Build-Tools. <data>Tags sind nicht erforderlich .

Xtreme Biker
quelle
Dies sollte als die richtige Antwort markiert werden. Ruhe alle sind nur Problemumgehungen. Keine Notwendigkeit, Namespaces zu verschieben oder Datenelemente hinzuzufügen
Vicky Kapadia
8

Wenn Sie einen Basisjob ausführen, um die Datenbindung in Ihrem Projekt zu aktivieren, z. B. enable in gradle und layout tag in xml , wenn Sie den XML-Code ändern und keine neue Datenbindungsklasse für diese XML generieren, können Sie auf schnelle Weise nur Daten generieren Bindungsklasse in gradle-> other-> datenbindunggenbaseclassesDebug es schnell mehr als das gesamte Projekt. Es wird nur eine Datenbindungsklasse generiert. Geben Sie hier die Bildbeschreibung ein

Mahdi Azadbar
quelle
4
dataBinding {
        enabled = true
    }

Fügen Sie Ihrer Datei gradle.properties die folgende Option hinzu, um den neuen Datenbindungs-Compiler zu aktivieren:

android.databinding.enableV2=true
Samir Mangroliya
quelle
3

Datenbindungsklassen werden während des Builds generiert. Nachdem Sie die Datenbindung im Gradle-Build der App aktiviert und Ihre XML-Datei mit dem Layout-Tag umgeben haben, sollten Sie Ihre App neu erstellen. Wenn dies nicht hilft, löschen Sie Ihren Build-Ordner und wiederholen Sie den Vorgang.

Schadenfreude
quelle
2

Dank dieser Antwort hier muss der "Layout-Namespace" entweder gelöscht werden oder Sie benötigen einen neuen eindeutigen Namen.

Hier sind die Optionen, die für mich funktioniert haben:

  1. Erstellen Sie einen neuen Namen für das Layout, um sicherzustellen, dass es generiert werden kann. Dies löste mein Problem, bei dem ich ein Layout hatte, das zuerst ohne Datenbindung erstellt wurde - nennen wir es fragment_abc.xml. Als ich versuchte, eine Datenbindung hinzuzufügen, wurde diese nicht erkannt - selbst nach mehreren leeren Cache- und Neustartaufrufen. Sobald ich jedoch eine Kopie des Layouts erstellt hatte fragment_abc2.xml, erhielt ich sofort das generierte datenbindende .java / .class-Objekt.

  2. Nachdem ich die obige Arbeit gesehen hatte, versuchte ich, den Ordner / build einfach aus dem Modul zu entfernen und das Projekt neu zu erstellen - dies funktionierte, um die Datenbindung für das ursprüngliche Layout zu erhalten.

Gene Bo
quelle
1

Das einzige, was ich mir vorstellen kann, wenn möglich, ist, wenn Sie es nicht haben

dataBinding {
    enabled true
}

in Ihrer Gradle-Datei. Wenn nicht, fügen Sie es einfach der Gradle-Datei hinzu. dh

android {
  ......

  dataBinding {
    enabled true
  }
}

Synchronisieren Sie dann Ihr Projekt. Wenn es immer noch fehlschlägt, müssen Sie möglicherweise Invalidate / Restart Ihres Android-Studios durchführen

Hassan Semiu Ayomon
quelle
Ich habe in meiner Frage klar erwähnt, dass nach dem Hinzufügen <variable>in XML eine Bindungsklasse generiert wird. Es gibt also keinen Fall, dass keine dataBindingGradle-Datei hinzugefügt wird, wenn ich keine hinzugefügt habe, sollte keine Bindungsklasse generiert werden.
Ravi
Vor dem Synchronisieren und Neustarten. Bitte versuchen Sie 'Make'. Es klappt.
Nizamudeen Sherif
1

Ich weiß nicht, ob es für Sie funktionieren wird oder nicht. Benennen Sie einfach den Namen der Layout-XML-Datei um. Angenommen, Ihr Layoutname lautet activity_main.xml. Ändern Sie ihn einfach in main.xml umbenennen und benennen Sie ihn erneut in activity_main.xml um . Anschließend können Sie die Importoption in ActivityMainBinding anzeigen .

Hoffe es funktioniert für dich.

Sudhansu
quelle
1

Wenn Sie mit einer multimodulen Android-Anwendung arbeiten, überprüfen Sie den Pfad Ihrer Bindungsklasse. Vielleicht sollten Sie verwenden:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding anstelle von:

import com.yourcompany.app.android.databinding.FragmentABCtBinding

kosiara - Bartosz Kosarzycki
quelle
1

Löschen Sie Layouts und machen Sie sie rückgängig. Stellen Sie anschließend sicher, dass die generierten Bindungsklassen korrekt importiert wurden.

Ahmed AlAskalany
quelle
0

Ich hatte das gleiche Problem. Alles was du richtig gemacht hast. Sie müssen eine Variable innerhalb des Daten-Tags in XML hinzufügen. Dazu sollten Sie eine Beispielmodellklasse erstellen und als Variable im Daten-Tag hinzufügen.

Bis dahin wird die generierte ActivityMainBinding nicht angezeigt.

Srinivasan
quelle
0

Ich hatte ein ähnliches Problem, bei dem ich das Layout verpackt und meine Datenbindung in der Gradle-Datei aktiviert hatte. Die Hauptaktivität konnte meine Klassen immer noch nicht verstehen oder sehen. Was es für mich behoben hat, war das Hinzufügen der Bindungsvariablen und das Importieren der Bindung trotzdem. Von dort aus baute ich einfach die Lösung und dann schien es zu wissen, was die Klasse war. Von dort konnte ich meine generierten Kamelfallklassen importieren.

stegnerd
quelle
0

Ich habe das Problem bekommen und das Problem war im Layout, dass das verwendete Feld kein String war, sondern ein Datum.

Es sieht so aus, als müssten alle Felder Text sein, zumindest mit der TexView-Komponente.

Wenn Sie mit dem Befehl ./gradlew erstellen, erstellen Sie --stacktrace

Dies zeigt besser die Fehler.

jactive
quelle
0

In meinem Fall dachte ich, dass die generierte Klasse mit meinen üblichen Klassen im srcOrdner angezeigt werden muss. Außerdem dachte ich, dass der Name der generierten Klasse etwas anders sein sollte. Es war alles mein Fehler. Die generierte Klasse befindet sich im buildOrdner build -> generated -> ...Pfad. Wenn die generierte Klasse in Ihrer Aktivität nicht importiert wird, fügen Sie den Import hinzu

import com.yourcompany.app.databinding.ActivityMainBinding;"
Kseniya
quelle
0

Falls in DataBindingUtil.setContentView der folgende Fehler auftritt

Ungelöste Referenz: activity_main

Sie müssen lediglich die folgende Importanweisung entfernen

android.R importieren

Ich habe die Lösung in einem anderen Forum gefunden. Quelle

Tim John
quelle
0

Wenn kürzlich ein vorhandenes Projekt in AndroidX migriert wurde, müssen Sie Ihren Import von ersetzen

import com.yourpackagename.BR;

zu

import androidx.databinding.library.baseAdapters.BR;

Nach Google 2 Tage endlich Lösung bekommen, welche für mich funktioniert.

Milan Sheth
quelle
1
Bindungsressource ( .BR. ) Wie Ressource ( .R. ). Es wird basierend auf Ihrer Projektressource (ID, Zeichenbar, Farbe, ...) generiert und in Ihrem Projektpaket ( your.project.package.BR) platziert. Nicht in Drittanbieter-Bibliotheken wie androidx.databinding.library.baseAdapters.BR.
Dphans
0

In einigen Fällen wird eine Datei im generierten Verzeichnis nicht angezeigt. Möglicherweise binden Sie eine Eigenschaft, die im Ansichtsmodell nicht deklariert ist. Es gibt Ihnen im Wesentlichen keinen Flusenfehler, wenn Sie dies in XML tun.

Uzair
quelle
0

Wenn Sie Serializable -> implementieren, müssen Sie das implementieren Serializable

Andernfalls wird dieser Fehler angezeigt. Hoffe, es wird jemandem in Zukunft helfen

In meinem Fall benutze ich die Paketbibliothek. Ich habe @Parcel in meiner Unterklasse nicht kommentiert

Ranjith Kumar
quelle
0

Zusätzlich zu den obigen Schritten können Sie auch den Variablentyp überprüfen. Stellen Sie sicher, dass es sich um einen String für TextView handelt oder um den gleichen wie in der BindingAdapter. Beispielsweise:

data class MyDataObject(val name: String, val age: Int)

und in XML:

android:text="@{dataobject.age}"

Dies führt zu dem oben genannten Fehler. Um dies zu beheben, können Sie entweder die Altersvariable vom Typ String festlegen oder String in Ihr XML importieren und String.valueOf(age)wie folgt verwenden:

<data>
    <import type="String" />
...
</data>

Und in Ihrer Textansicht:

android:text="@{String.valueOf(dataobject.age)}"
Shyam
quelle
0

Meine Lösung bestand darin, FragmentBinding als Suffix im Klassennamen zu verwenden.

Für jede Layoutdatei wird eine Bindungsklasse generiert. Standardmäßig basiert der Name der Klasse auf dem Namen der Layoutdatei, konvertiert sie in Pascal-Groß- und Kleinschreibung und fügt ihr das Bindungssuffix hinzu. Der obige Layout-Dateiname lautet activity_main.xml, daher lautet die entsprechende generierte Klasse ActivityMainBinding. Diese Klasse enthält alle Bindungen von den Layout-Eigenschaften (z. B. die Benutzervariable) zu den Ansichten des Layouts und weiß, wie Werte für die Bindungsausdrücke zugewiesen werden.

Die Nomenklatur des Namens der Aktivität oder Fragmentklasse kann in Bezug auf Präfixe variieren. Weil das Suffix immer bindend ist.

Nachdem Sie der Antwort von Khemraj und Invalidate Caches / Restart gefolgt sind , sollten Sie ActivityBinding oder FragmentBinding neu schreiben , um die IDE-Vorschläge der bereits generierten Klassen zu erhalten und den Import NICHT fest zu codieren.

In meinem Fall habe ich versucht, den Namen der Klasse rückwärts FragmentCompetitionsBindingstatt zu importieren CompetitionsFragmentBinding.

GL

Quelle

Braian Coronel
quelle
0

In meinem Fall wurden keine Datenbindungsklassen generiert, da ich das mipmap Android Resource Directory gelöscht hatte. Ich habe das Verzeichnis res / mipmap / neu erstellt und die Datenbindungsklassen wurden wiederhergestellt.

fehlerhaft
quelle
0

Ich habe ein ähnliches Problem festgestellt , bei dem DataBinding die BindingImpl- Klasse nicht generieren konnte . In meinem Fall gab es ein Problem mit einer Methode in der Datenklasse, bei der der Name falsch verwendet wurde: Das Modell enthielt eine Methode onSignInCliked () und in dem Layout, das ich onSigninCliked () verwendet habe . Beachten Sie die Anmeldung vs Anmeldung .

Die Fehlermeldung reichte nicht aus und ich entdeckte das Problem erst, als ich das Build-Skript mit der Option "Stack-Trace" verwendete.

Ionut Negru
quelle
0

Stellen Sie sicher, dass die Datenbindung aktiviert ist

android {
...
   dataBinding {
        enabled = true
    }
...
}

Projekt mit gradle synchronisieren dan klicke auf die Schaltfläche (Projekt mit Gradle synchronisieren)

fahrizal89
quelle
0

Wenn es ein Problem mit Ihrer XML-Datei gibt, würde die Datenbindungsklasse dies nicht tun generiert. Eine schnelle Lösung wäre, die XML-Datei zu durchlaufen und nach Syntaxfehlern zu suchen (die normalerweise rot hervorgehoben sind). Die Fehler können in Form von nicht vorhandenen oder falschen Referenzen, Tippfehlern usw. auftreten.

Stellen Sie im Wesentlichen sicher, dass Ihr XML-Code keine rot unterstrichene Zeile enthält. Wenn Sie fertig sind, wird neu erstellt und Ihre Datenbindungsklasse wurde generiert.

Taslim Oseni
quelle
-1

1. Unten in App Gradle hinzufügen

 dataBinding {
        enabled = true
    }

2. Schreiben Sie im XML-Layout den folgenden Code

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.
Rohan Lodhi
quelle
3
Warum sollte dataBinding im Allgemeinen eine Internetgenehmigung erfordern?
M. Pomeroy
1
@ M.Pomeroy ja es ist nicht erforderlich, nicht bearbeitet die Antwort danke
Rohan Lodhi
-5

Verwenden Sie den Klassenpfad 'com.android.databinding: dataBinder: 1.0-rc0'.

Sumanta Banerjee
quelle
Für Gradle 1.5.0 und höher ist es nicht erforderlich, diesen Klassenpfad zu verwenden.
Ravi