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


@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


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.


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 .


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.


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.


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.


4

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


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>

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.


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


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.


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. *;


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.


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>

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


0

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.