Android - DataBinding - Wie und wann werden die Binding-Klassen generiert?

73

DataBinding Guide States

  By default, a Binding class will be generated based on the name of the layout 
file, converting it to Pascal case and suffixing “Binding” to it. 
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.

Wann wird die Binding-Klasse, hier ActivityMainBinding, generiert? Ich habe einen Fehler bei der Kompilierung. "ActivityMainBinding kann nicht aufgelöst werden".

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);

Jede Hilfe wird geschätzt. Vielen Dank

Sowmia
quelle
@DerGol ... lum, ich weiß, es ist eine Beta-Version. Ich möchte es nur ausprobieren.
Sowmia
Nach diesem Absatz ist es aus Google-Sicht in Ordnung, Apps mit dieser Bibliothek zu veröffentlichen. Sie müssen sich nur über den Beta-Status und die Auswirkungen im Klaren sein: *** Entwickler sollten sich frei fühlen, Apps zu veröffentlichen, die mit der Beta-Version der Data Binding Library erstellt wurden Es ist immer eine gute Idee, Ihre App gründlich zu testen, wenn Sie neue Bibliotheken oder Tools einführen.
Jürgen 'Kashban' Wahlmann
Kann jemand darauf hinweisen, wo sich die generierten Klassen / Dateien im Projekt befinden?
CodyF
Nur der Vollständigkeit halber: Der gesamte generierte Code befindet sich in "module_dir" / build / generate. Weiter unten gibt es gemäß den Ressourcen ein res-Verzeichnis, gemäß den Java-Klassen gibt es src mit Affinitäten (z. B. dataBinding). Diese Struktur wird von Gradle 2.2+
Lukassos
In meinem Fall wird die Datenklasse rechtzeitig aktualisiert, wenn die XML-Datei das Element <data> </ data> enthält, oder sie wird erst nach dem erneuten Öffnen der Studio-IDE aktualisiert.
Freddie

Antworten:

92

Wie lautet Ihr Layoutname?

Die obige Layoutdatei war activity_main.xml, daher war die generierte Klasse ActivityMainBinding.

Dies bedeutet, dass der generierte Klassenname vom Namen Ihres Layouts abhängt.

Activity_main.xml -> ActivityMainBinding.java

Ich denke, Ihr Aktivitätsname ist "main_activity", daher sollte der generierte Name der Bindungsklasse MainActivityBinding und nicht ActivityMainBinding sein

Mao
quelle
In diesem Fall ist es definitiv verwirrend, dass Klassen mit "Aktivität" nachfixiert werden, während xmls vorangestellt werden!
dVaffection
30
Dies beantwortet nicht die Frage "wie und wann". Ich habe das gleiche Problem wie das OP, die Bindungsdatei wird für mich NICHT GENERIERT. Diese Antwort informiert Sie nur über die Namenskonvention und gibt keinen Hinweis darauf, wie das Problem der fehlenden Datei behoben werden kann.
Siavash
2
@Siavash Ich weiß nicht, wie und wann, aber ich hatte ein ähnliches Problem, und was es für mich behoben hat, war das Einfügen aller xmlns: app = " schemas.android.com/apk/res-auto " Sachen das Layout-Tag anstelle des Draufsicht-Tags. Es war nur ein Versehen meinerseits, aber es machte mich verrückt, also dachte ich, ich würde es weitergeben, falls es jemand anderem helfen sollte.
Aezur
Bitte helfen Sie mir, ich habe einen Paketnamen wie com.asadmukhtar.show und der XML-Dateiname ist activity_splash. Nachdem die Datenbindung aktiviert wurde, wird meine Bindungsdatei immer in einem Paket wie com generiert. Beispiel: Warum dies passiert, folge ich dem MVVM-Modell. Bitte helfen Sie mir
Asad Mukhtar
36

Wenn die Bindungsklasse nicht generiert wird, starte ich Android Studio neu. Dann wird die Bindungsklasse generiert. Wird es nicht durch den Cache von Android Studio verursacht?

Übrigens, wenn Sie verwenden android-apt, überprüfen Sie es bitte. Weil dadurch die Bindungsklasse nicht generiert wird.

Frank Cheng
quelle
Ja Neustart funktioniert und Problem ist immer noch in Android Studio 2.1
Chatura Dilan
Richtig und besser, um den Cache ungültig zu machen und neu zu starten ... das passiert, wenn Sie die Datenbindung nach dem Erstellen des Layouts aktivieren.
Maher Abuthraa
Als 08/16 habe ich dieses Problem, wenn mehr als eine Instanz von AndroidStudio geöffnet ist. Ich musste neu starten, um die Bindungssuffixklasse zu sehen.
BlackCath
Bei mir ist die Bindungsdatei in \Project\app\build\generated\source\apt\development\debug\project\android\app\databindingJEDOCH vorhanden. Android Studio 3.1.3 meldet die Klasse als Unbekannt. Durch ungültige Caches und Neustart wird dies nicht behoben.
Jemand irgendwo
Außerdem generiert Android Studio immer wieder einen Fehler com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers. Was für eine Zeitverschwendung !
Jemand irgendwo
32

Haben Sie Ihre Layoutdatei für die Datenbindung aktualisiert? Sie werden nur für Layouts mit Datenbindung generiert.

Es muss mit einem layoutTag beginnen, das 2 untergeordnete Tags enthält (Daten und Ihre Stammansicht).

Etwas wie das:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout ...
   </LinearLayout>
</layout>

Wenn Ihr Layout dieses Formular hat, sollte AndroidStudio die Klasse automatisch vervollständigen. Außerdem wird es standardmäßig im <your.app.package>.databindingPaket generiert .

Yigit
quelle
2
Selbst wenn Sie Android Studio nicht verwenden, generiert das Gradle-Plugin den Code während der Annotationsverarbeitungsphase. Ohne Android Studio müssen Sie darauf vertrauen können, dass die Klasse generiert wird, und die Bindungsklasse selbst importieren. So etwas wie "import com.my.package.databinding.ActivityMainBinding;" für activity_main.xml
George Mount
1
Klasse wurde nicht generiert, wenn ich nur <Layout> und keine <Daten> hatte. Als ich <Daten> mit einer <Variable> hinzufügte, wurde eine Klasse generiert.
David Vávra
Vielen Dank für diese Antwort, kein <data> -Tag war mein Problem. Funktioniert übrigens auch ohne Hinzufügen einer Variablen.
ScottyC
Das hat es für mich gelöst. Dieser
Layoutabschnitt
15

Versuchen Sie, das Layout in umzubenennen main_activity.xml.

In meinem Fall hat es nicht funktioniert, eine Bindungsklasse für "activity_main.xml" zu generieren.
Aber das Umbenennen der Layoutdatei in hat einwandfrei main_activity.xmlfunktioniert.

surlac
quelle
Es hat auch bei mir funktioniert. Von nun an werde ich ´xxxxxx_activity.xml´ für alle meine Aktivitäten / Fragmente als neue Namenskonvention verwenden. Vielen Dank!
Van
14

Regel

Der Layoutname ist in snake_caseund der Name der generierten Bindungsklasse ist PascalCase.

Wenn Ihr Layoutname lautet, lautet der Name der activity_home.xmlBindungsklasse ActivityHomeBinding.class.

Problem

  1. Oft erhalten Sie keinen Importvorschlag für die DataBinding-Klasse.
  2. Die Bindungsklasse wird nicht generiert, wenn im Layout ein Problem auftritt.
  3. Die Bindungsklasse ist nicht verfügbar, wenn die Erstellung fehlgeschlagen ist

Hier ist Hack

Wenn Sie keinen Importvorschlag erhalten

  • Wenn Sie keinen Importvorschlag erhalten. Importieren Sie Ihre Bindungsklasse manuell wie folgt. (IDE zeigt oft keine Vorschläge für Bindungsklassen)

    import <yourpackage>databinding.ActivityMainBinding;
    

Importzeile zeigt immer noch Fehler?

  • Wenn in Ihrer Importzeile ein Fehler angezeigt wird, versuchen Sie , ein Projekt zu erstellen (Strg + F9) / Erstellen> Projekt erstellen . .
    1. Wenn die Erstellung aufgrund eines Fehlers fehlgeschlagen ist, beheben Sie ihn.
    2. Wenn die Erstellung erfolgreich ist, wird eine Bindungsklasse generiert.

Schneller Hack zum Generieren von Bindungsklassen-

  • Wenn Ihre Bindungsklasse nicht generiert wurde, schließen Sie das Projekt (Datei> Projekt schließen) und öffnen Sie es aus der letzten Zeit .

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

Schneller Hack zum Generieren von Layoutvariablen in Bindungsklassen-

  • Wenn Ihre Layoutdatenvariable nicht generiert wird, schließen Sie das Projekt (Datei> Projekt schließen) und öffnen Sie es aus der letzten Zeit .

Wenn Sie noch Probleme haben. Lassen Sie es mich in Kommentaren wissen oder sehen Sie diese Antwort zum besseren Verständnis.

Khemraj
quelle
4

Stellen Sie sicher, dass das Layout der:

 <data>
   <variable name="user" type="com.example.User"/>
 </data>

Befindet sich in der Datei activity_main.xml, wenn Sie nach ActivityMainBinding suchen. In den meisten Boilerplate-Projekten setzen Sie Ihre Inhaltsansicht auf activity_main.xml, blasen dann aber fragment_main.xml auf.

Wenn Sie Ihr Layout <data>in fragment_main.xml einfügen, wird als Klasse FragmentMainBinding generiert .

Hinweis: Dies mag nach dem Lesen offensichtlich erscheinen, kann jedoch beim Befolgen der Android-Dokumentation leicht übersehen werden.

CodyF
quelle
4

In meinem Fall funktioniert ein Neustart von Android Studio. Es ist ein Fehler in Android-Apt

Kamil Nekanowicz
quelle
4

Wenn Sie jemals einen eigenen Bindungsklassennamen angeben wollten, fügen Sie classdem dataElement mit dem Klassennamen einfach ein Attribut hinzu

Bindungsklassen können durch Anpassen des Klassenattributs des Datenelements umbenannt oder in verschiedenen Paketen platziert werden.

<data class="ContactItem">
    ...
</data>

<data class="com.example.ContactItem">
...
</data>
Bharatesh
quelle
Das Neustarten von Android Studio, wie von @Frank Cheng gepostet, funktioniert. Es ist jedoch mühsam, es jedes Mal neu zu starten, wenn ein neues Layout erstellt wird. Ich habe mich für diese Option entschieden, die Bindungsklassen selbst zu benennen, da dies ohne Probleme zu funktionieren scheint.
Velval
2

Nur ein einfacher Neustart hat bei mir nicht funktioniert. Ich musste Invalidate Caches and Restartdann die Bindungsklassen sehen. Es ist unter dem FileMenü für diejenigen, die es nicht wissen.

Jesaja
quelle
1

Damit die Android-Datenbindung ordnungsgemäß funktioniert, müssen Sie Android-Tools für gradle (com.android.tools.build:gradle)> = 1.3.0 verwenden.

Ihr Projekt build.gradle muss also so aussehen:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath "com.android.databinding:dataBinder:1.0-rc1"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Und das Modul build.gradle muss dieses Plugin haben:

apply plugin: 'com.android.databinding'

Überprüfen Sie schließlich in Ihrem Modul, ob Sie die neueste buildToolsVersion verwenden (derzeit ist es 22.0.1). Ich bin mir nicht sicher, ob dies erforderlich ist, aber möglicherweise fühlen Sie sich gut, wenn Sie auf dem neuesten Stand der Technik sind ^ _ ^:

buildToolsVersion '22.0.1'

Synchronisieren Sie Gradle erneut und erstellen Sie Ihr Projekt neu . Es ist wahrscheinlich, dass ohne eine Neuerstellung des Projekts keine SomeLayoutBindingKlassen generiert werden.

In Android Studio kann dies über das Anwendungsmenü erfolgen: Build -> Rebuild project

Клаус Шварц
quelle
1
Dies führt zu einem Fehler in stackoverflow.com/questions/35250956/… (Fehler: (3, 0) Ursache: org / apache / commons / lang3 / StringUtils)
Dika
1

Konnte das gleiche Problem.

Der Grund für "ActivityMainBinding kann nicht aufgelöst werden" ist, dass Ihre Bindungsdatei nicht generiert wird. Versuchen Sie, das Projekt zu bereinigen und neu zu erstellen. Stellen Sie außerdem sicher, dass Sie die folgenden Schritte ausgeführt haben:

  1. Klassenpfad "com.android.databinding: dataBinder: 1.0-rc4" -> Fügen Sie dies in die Build-Datei des Hauptmoduls ein
  2. Wenden Sie das Plugin 'com.android.databinding' auf Ihr App-Modul an, das Sie erstellen
  3. Sauber
  4. Wiederaufbauen. Überprüfen Sie unter, ob build-> indermediates-> Ihr Paketname-> Datenbindungsordner mit der ActivityMainBinding-Klasse generiert wird.

Alternativ, wenn Sie die generierte Quelle anzeigen möchten.

  1. Klassenpfad 'com.neenbedankt.gradle.plugins: android-apt: 1.7' -> auf Ihr Hauptmodul anwenden.
  2. Wende das Plugin 'com.neenbedankt.android-apt' -> auf dein App-Modul an
  3. apt 'com.android.databinding: compiler: 1.0-rc0' -> in Ihre Abhängigkeiten aufnehmen.

Diese Klassen werden beim ersten Build generiert. Stellen Sie außerdem sicher, dass die Anwendungs- ID in Ihrem Anwendungsmodul mit dem Paketnamen in AndroidManifest.xml Ihres Anwendungsmoduls übereinstimmt. Hoffe das hilft.

Ashish Bulchandani
quelle
1

Ich habe die Erfahrung gemacht, dass Android Studio 3.1.3 die Datenbindungsklasse generiert hat, nachdem ich auf "Erstellen> Projekt neu erstellen" geklickt habe. Die Datei wurde gespeichert in:

\ Project \ App \ Build \ Generated \ Source \ Apt \ Development \ Debug \ Project \ Android \ App \ Databinding

Android Studio hat die Bindungsklasse im Quellcode jedoch weiterhin als "Unbekannt" gemeldet.

Um das Problem endgültig zu beheben, habe ich die Importanweisung manuell hinzugefügt :

import project.android.app.databinding. *;

Irgendwer irgendwo
quelle
0

Ein seltsamer "Fehler" in Android-Studio führt dazu, dass die generierte BR.java-Datei die @BindableFelder nicht verwendet und die _allEigenschaft nur dann besitzt, wenn kein res / layout-Verzeichnis vorhanden ist.

Es ist mir passiert, als ich eine App "Keine Aktivität" erstellen wollte, um eine Bibliothek zu haben, die meine verschiedenen bindbaren Daten enthält.

Aurélien Lemaitre
quelle
0

In meinem Fall habe ich gerade meine Layout-XML in <layout></layout>Tags eingeschlossen, und das war es, ohne das Daten-Tag hinzuzufügen, war es mir gelungen, Datenbindungen zu generieren. Hoffe das hilft.

<data>
       <variable name="user" type="com.example.User"/>
</data>
Qasim
quelle
0
<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

// Denken Sie daran, dass Sie Build-> Rebuild Project benötigen

a442509097
quelle
0

Überprüfen Sie die Zugriffsebene der Felder Ihres Objekts. Als ich öffentlich wurde, funktionierte es hier

Kleyton Santos
quelle
0

Wenn Sie Android Studio nicht neu starten möchten, können Sie activity_main.xml in etwas anderes umbenennen, z. B. activity_m.xml, und es dann wieder in activity_main.xml umbenennen. Es ist viel schneller als ein Neustart von Android Studio.

Klicken Sie zum Umbenennen mit der rechten Maustaste auf activity_main.xml und wählen Sie Refactor => Umbenennen

Rajeman
quelle