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 ActivityMainBinding
in 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 ActivityMainBinding
Klasse generieren .
Android Studio: 2.1.3 Klassenpfad
: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
in deinem build.gradle?ActivityMainBinding
, oder es hat etwas mit diesem Fehler zu tun .<variable>
in xml<variable>
, generiert es Bindungsklasse ohne Projekt erstellen .Antworten:
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
Ü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 .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 layout
mit Datenbindung (<layout
tag). Etwas wie das.Ü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.
4. Importvorschlag nicht angezeigt?
Wenn Sie tippen
ActivityMai...
, wird manchmal kein Vorschlag angezeigt . In diesem Fall wird der Import manuell durchgeführt .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) .
6. Schließen und öffnen Sie das aktuelle Projekt
Ich mache das immer, weil es viel weniger Zeit braucht als
Rebuild
/Make
project.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
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 verwendenbinding.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
<variable
in 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
<variable
Elemente 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.
Dies ist alles, was ich tue, um meine Datenbindungsfehler zu lösen. Wenn Sie weitere Probleme haben, können Sie diese hier kommentieren.
quelle
DataBinding-Klasse wird automatisch generiert.
Wenn Ihr XML-Name activity_test lautet, lautet die Bindungsklasse ActivityTestBinding.
aber,
Layout sollte Layout als root haben
quelle
ConstraintLayout
als Wurzel. Danke dir!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.
quelle
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 :)
quelle
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 .quelle
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.
quelle
Fügen Sie Ihrer Datei gradle.properties die folgende Option hinzu, um den neuen Datenbindungs-Compiler zu aktivieren:
quelle
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.
quelle
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:
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 hattefragment_abc2.xml
, erhielt ich sofort das generierte datenbindende .java / .class-Objekt.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.
quelle
Das einzige, was ich mir vorstellen kann, wenn möglich, ist, wenn Sie es nicht haben
in Ihrer Gradle-Datei. Wenn nicht, fügen Sie es einfach der Gradle-Datei hinzu. dh
Synchronisieren Sie dann Ihr Projekt. Wenn es immer noch fehlschlägt, müssen Sie möglicherweise Invalidate / Restart Ihres Android-Studios durchführen
quelle
<variable>
in XML eine Bindungsklasse generiert wird. Es gibt also keinen Fall, dass keinedataBinding
Gradle-Datei hinzugefügt wird, wenn ich keine hinzugefügt habe, sollte keine Bindungsklasse generiert werden.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.
quelle
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
quelle
Löschen Sie Layouts und machen Sie sie rückgängig. Stellen Sie anschließend sicher, dass die generierten Bindungsklassen korrekt importiert wurden.
quelle
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.
quelle
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.
quelle
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.
quelle
In meinem Fall dachte ich, dass die generierte Klasse mit meinen üblichen Klassen im
src
Ordner 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 imbuild
Ordnerbuild -> generated -> ...
Pfad. Wenn die generierte Klasse in Ihrer Aktivität nicht importiert wird, fügen Sie den Import hinzuquelle
Falls in DataBindingUtil.setContentView der folgende Fehler auftritt
Sie müssen lediglich die folgende Importanweisung entfernen
Ich habe die Lösung in einem anderen Forum gefunden. Quelle
quelle
Wenn kürzlich ein vorhandenes Projekt in AndroidX migriert wurde, müssen Sie Ihren Import von ersetzen
zu
Nach Google 2 Tage endlich Lösung bekommen, welche für mich funktioniert.
quelle
your.project.package.BR
) platziert. Nicht in Drittanbieter-Bibliotheken wieandroidx.databinding.library.baseAdapters.BR
.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.
quelle
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
quelle
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:und in XML:
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:Und in Ihrer Textansicht:
quelle
Meine Lösung bestand darin, FragmentBinding als Suffix im Klassennamen zu verwenden.
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
FragmentCompetitionsBinding
statt zu importierenCompetitionsFragmentBinding
.GL
Quelle
quelle
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.
quelle
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.
quelle
Stellen Sie sicher, dass die Datenbindung aktiviert ist
dan klicke auf die Schaltfläche (Projekt mit Gradle synchronisieren)
quelle
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.
quelle
1. Unten in App Gradle hinzufügen
2. Schreiben Sie im XML-Layout den folgenden Code
quelle
Verwenden Sie den Klassenpfad 'com.android.databinding: dataBinder: 1.0-rc0'.
quelle