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
android
data-binding
Sowmia
quelle
quelle
Antworten:
Wie lautet Ihr Layoutname?
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
quelle
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.quelle
\Project\app\build\generated\source\apt\development\debug\project\android\app\databinding
JEDOCH vorhanden. Android Studio 3.1.3 meldet die Klasse als Unbekannt. Durch ungültige Caches und Neustart wird dies nicht behoben.com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers
. Was für eine Zeitverschwendung !Haben Sie Ihre Layoutdatei für die Datenbindung aktualisiert? Sie werden nur für Layouts mit Datenbindung generiert.
Es muss mit einem
layout
Tag 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>.databinding
Paket generiert .quelle
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.xml
funktioniert.quelle
Regel
Der Layoutname ist in
snake_case
und der Name der generierten Bindungsklasse istPascalCase
.Problem
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?
Schneller Hack zum Generieren von Bindungsklassen-
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 Sie noch Probleme haben. Lassen Sie es mich in Kommentaren wissen oder sehen Sie diese Antwort zum besseren Verständnis.
quelle
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.
quelle
In meinem Fall funktioniert ein Neustart von Android Studio. Es ist ein Fehler in Android-Apt
quelle
Wenn Sie jemals einen eigenen Bindungsklassennamen angeben wollten, fügen Sie
class
demdata
Element mit dem Klassennamen einfach ein Attribut hinzu<data class="ContactItem"> ... </data> <data class="com.example.ContactItem"> ... </data>
quelle
Nur ein einfacher Neustart hat bei mir nicht funktioniert. Ich musste
Invalidate Caches and Restart
dann die Bindungsklassen sehen. Es ist unter demFile
Menü für diejenigen, die es nicht wissen.quelle
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
SomeLayoutBinding
Klassen generiert werden.In Android Studio kann dies über das Anwendungsmenü erfolgen:
Build -> Rebuild project
quelle
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:
Alternativ, wenn Sie die generierte Quelle anzeigen möchten.
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.
quelle
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 :
quelle
Ein seltsamer "Fehler" in Android-Studio führt dazu, dass die generierte BR.java-Datei die
@Bindable
Felder nicht verwendet und die_all
Eigenschaft 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.
quelle
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>
quelle
<data class="MainActivityBinding"> <variable name="user" type="com.example.administrator.my_mvvm.User" /> </data>
// Denken Sie daran, dass Sie Build-> Rebuild Project benötigen
quelle
Überprüfen Sie die Zugriffsebene der Felder Ihres Objekts. Als ich öffentlich wurde, funktionierte es hier
quelle
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
quelle