J'utilise la liaison de données dans mon projet, lorsque j'utilise <layout>
et <data>
dans ma classe de liaison xml n'est pas générée.
Par exemple, j'ai 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>
Maintenant, si j'écris ActivityMainBinding
dans mon activité / fragment, cela indique que la classe n'est pas disponible. Mais après avoir inclus <variable>
dans mon fichier xml, il est capable de générer une ActivityMainBinding
classe.
Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
dans votre build.gradle?ActivityMainBinding
, ou il doit faire quelque chose avec ce bogue.<variable>
en xml<variable>
, il génère une classe de liaison sans construire de projet.Réponses:
Je n'ai pas obtenu de réponses satisfaisantes. Voici donc les conseils qui résument mes connaissances en matière de liaison de données.
Conseils pour résoudre les problèmes de DataBinding
Mettre à jour
Pour obtenir des erreurs et des suggestions plus précises , je recommande fortement de mettre à jour la version du plugin Android Studio et Gradle à la dernière version. Parce que je ne suis pas confronté à beaucoup de problèmes après la version AS 3.2.
Voir le dernier Android Studio et le dernier plug-in Gradle .
Solution originale
Vérifiez ces points un par un. N'importe lequel de ces éléments peut rendre votre travail terminé. Le point 3 pour durer est vraiment important, alors ne les manquez pas.
1. Vérifiez si la liaison de données est activée
La liaison de données doit être activée dans
build.gradle
. Sinon, ajoutez ceci et Sync .2. Vérifiez que la mise en page est convertie en mise en page de reliure
Maintenant, si vous voulez que la classe de liaison de données soit générée, vous devez encapsuler
xml layout
avec la liaison de données (<layout
balise). Quelque chose comme ça.Parallèlement à cela, vérifiez si les noms des variables de liaison sont corrects comme dans la classe de modèle de vue
3. Nom de classe de liaison généré automatiquement?
Votre classe de liaison de données doit être générée après la création de la disposition de liaison.
4. Vous ne voyez pas la suggestion d'importation?
Parfois, lorsque vous tapez
ActivityMai...
, il n'affiche pas de suggestion , dans ce cas, importez manuellement .5. Lire le journal des échecs de construction
Votre classe de liaison et les nouvelles variables de mise en page ne seront pas générées si votre construction échoue. Alors commencez par créer un projet avec Ctrl + F9 (Construire> Créer un projet) .
6. Fermez et ouvrez le projet de
Je fais toujours cela car cela prend beaucoup moins de temps que
Rebuild
/Make
project.Notez que je préfère Fermer et Ouvrir à partir de Récent car cela prend beaucoup moins de temps que Reconstruire / Redémarrer l'IDE .
7. Projet de reconstruction
Si toujours votre classe n'est pas générée. (Un certain temps, lorsque nous collons le fichier de mise en page, cela se produit). Ensuite, reconstruisez le projet à partir de
Build> Rebuild
( Ne pas générer ni créer de projet ). Il générera votre classe de liaison de données. ( Rebuild fait de la magie pour moi. )8. Avoir le dernier Android Studio
Après avoir mis à jour AS vers Android Studio 3.2 , j'ai senti de nombreux bugs corrigés dans la génération automatique de liaison de données. Donc, vous devriez également avoir le dernier AS.
Solution pour
<variables
Habituellement, lorsque nous mettons une variable dans la mise en page, cela crée un getter et un setter. Et nous pouvons utiliser
binding.setItem(item);
etbinding.getItem();
, mais si vous ne pouvez pas voir ces méthodes, lisez les informations ci-dessous.1. Fermez et ouvrez le projet de
Si vous avez créé une variable de données -
<variable
dans votre mise en page et qu'elle n'affiche pas son setter et son getter dans la classe de liaison de données, fermez et ouvrez à partir de Récent votre projet.2. Nettoyez le projet après avoir changé le type
Si vous avez changé le type de certains
<variable
dans votre mise en page et que le type de setter getter ne change pas, Clean project (Build> Clean Project
)Derniers mots
Enfin, si votre classe de liaison n'est toujours pas générée, nous avons notre arme la plus puissante. - Redémarrez Android Studio: D
C'est tout ce que je fais pour résoudre mes erreurs de liaison de données. Si vous rencontrez d'autres problèmes, vous pouvez commenter ici.
la source
Classe DataBinding générée automatiquement.
si votre nom xml est activity_test, la classe Binding sera ActivityTestBinding.
mais,
la mise en page doit avoir la mise en page en tant que racine
la source
ConstraintLayout
comme racine. Je vous remercie!J'ai eu le même problème. Après avoir lu les documents Android SDK, il n'y a que le nom de fichier attendu à créer, mais rien sur ce qu'il faut faire si cela ne se produit pas. J'ai remarqué après quelques recherches supplémentaires qu'après avoir supprimé l'espace de noms de l'élément de mise en page comme ci-dessous (en utilisant votre exemple), cela a fonctionné pour moi.
la source
Dans mon cas, la classe Binding a été générée et en place (mais je pensais que ce n'était pas le cas) ... mais elle n'ajoute pas automatiquement l'importation de ladite classe à la section d'importation d'activité / de fragment ... alors ... OPTION + ENTRER :)
la source
Après l'avoir configuré correctement (y compris l'espace de noms xml et tout encapsuler dans
<layout>
), celui qui a fonctionné pour moi était de faire Build -> Make project. Ni Clean Project ni Rebuild Project ne l'ont fait. Je suis dans Android Studio 2.3.1, en utilisant les outils de construction 26.0.2. Il n'y a pas besoin de<data>
balises.la source
si vous effectuez un travail de base, pour activer la gestion des données dans votre projet, comme utiliser enable dans gradle et utiliser la balise de mise en page en xml , lorsque vous changez le code xml et que vous n'avez pas généré de nouvelle classe de liaison de données pour ces xml, vous pouvez utiliser un moyen rapide pour générer uniquement des données binding class dans gradle-> other-> databindinggenbaseclassesDéboguez -le plus rapidement que l'ensemble du projet bulid. il génère uniquement une classe de liaison de données.
la source
Pour activer le nouveau compilateur de liaison de données, ajoutez l'option suivante à votre fichier gradle.properties:
la source
Les classes de liaison de données sont générées pendant la génération.Après avoir activé la liaison de données dans la version Gradle de l'application et entouré votre XML avec la balise de mise en page, vous devez reconstruire votre application. Si cela ne vous aide pas, supprimez votre dossier de construction et recommencez.
la source
Merci à cette réponse ici - il semble que l ' "espace de noms de mise en page" doit soit être effacé, soit vous avez besoin d'un nouveau nom unique.
Voici les options qui ont fonctionné pour moi:
Créez un nouveau nom pour la mise en page pour vous assurer qu'elle peut être générée. Cela a résolu mon problème, où j'avais une mise en page qui avait été créée pour la première fois, sans liaison de données - appelons-la
fragment_abc.xml
. Lorsque j'ai essayé d'y ajouter une liaison de données, cela n'a pas été reconnu - même après plusieurs appels de suppression du cache et de redémarrage. Cependant, dès que j'ai fait une copie de la mise en pagefragment_abc2.xml
, j'ai immédiatement obtenu l'objet .java / .class de liaison de données généré.Après avoir vu le travail ci-dessus, j'ai essayé de supprimer simplement le dossier / build du module et de reconstruire le projet - cela a fonctionné pour obtenir la liaison de données pour la mise en page d'origine.
la source
La seule chose que je peux imaginer si possible, c'est si vous n'avez pas
dans votre fichier gradle. Sinon, ajoutez-le simplement au fichier gradle. c'est à dire
puis synchronisez votre projet. Si cela échoue toujours, vous devrez peut-être faire Invalider / Redémarrer votre studio Android
la source
<variable>
en xml, il génère une classe de liaison, il n'y a donc aucun cas de ne pas ajouterdataBinding
de fichier gradle, si je n'ai pas ajouté, cela ne devrait pas générer de classe de liaison.Je ne sais pas que cela fonctionnera pour vous ou non. Renommez simplement le nom du fichier XML de mise en page. Comme supposons que votre nom de mise en page est activity_main.xml, changez simplement le renommer en quelque chose comme main.xml et renommez-le à nouveau en activity_main.xml . Ensuite, vous pouvez voir l'option d'importation sur ActivityMainBinding .
J'espère que ça marche pour toi.
la source
Lorsque vous travaillez avec une application Android multimodule, vérifiez votre chemin de classe de liaison. Vous devriez peut-être utiliser:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
au lieu de:import com.yourcompany.app.android.databinding.FragmentABCtBinding
la source
Supprimez les mises en page et annulez-les, puis assurez-vous que les classes de liaison générées sont correctement importées par la suite.
la source
J'ai eu le même problème. Tout ce que vous avez fait correctement. La chose est que vous devez ajouter une variable à l'intérieur de la balise de données en XML. Pour cela, vous devez créer un exemple de classe de modèle et l'ajouter en tant que variable dans la balise de données.
Jusqu'à ce que vous ne puissiez pas voir ActivityMainBinding généré.
la source
J'ai eu un problème similaire où j'avais la mise en page enveloppée et ma liaison de données activée dans le fichier gradle. L'activité principale ne pouvait toujours pas intellisense ou voir mes cours. Ce qui a résolu le problème pour moi était d'ajouter la variable de liaison et d'importer la liaison de toute façon. À partir de là, je viens de créer la solution, puis il a semblé savoir ce qu'était la classe. De là, j'ai pu importer mes classes de cas de chameaux qui ont été générées.
la source
J'ai eu le problème et le problème était dans la mise en page, le champ utilisé n'était pas une chaîne, c'était une date.
Il semble que tous les champs doivent être du texte pour fonctionner, au moins avec le composant TexView.
Si vous construisez avec la commande ./gradlew build --stacktrace
Cela montre mieux les erreurs.
la source
Dans mon cas, je pensais que la classe générée devait apparaître avec mes classes habituelles dans le
src
dossier. De plus, j'ai pensé que le nom de la classe générée devrait être légèrement différent. C'était mon erreur. La classe générée se trouve dans lebuild
dossier,build -> generated -> ...
chemin. S'il n'y a pas d'importation de la classe générée dans votre activité, ajoutez l'importationla source
Au cas où vous obtenez l'erreur suivante dans DataBindingUtil.setContentView
tout ce que vous avez à faire est de supprimer la déclaration d'importation suivante
J'ai trouvé la solution sur un autre forum. La source
la source
Si récemment un projet existant a migré vers androidx, vous devez remplacer votre importation de
à
Après Google, 2 jours ont finalement eu une solution, laquelle fonctionne pour moi.
la source
your.project.package.BR
). Pas à l'intérieur d'une bibliothèque tierce commeandroidx.databinding.library.baseAdapters.BR
.Il y a des cas où vous ne verrez pas de fichier sous le répertoire généré, vous pourriez lier une propriété qui n'est pas déclarée dans viewmodel. Cela ne vous donne pas essentiellement une erreur de charpie si vous le faites en xml.
la source
Si vous implémentez le Serializable -> vous devez implémenter le Serializable
sinon vous obtiendrez cette erreur. J'espère que cela aidera quelqu'un à l'avenir
Dans mon cas, j'utilise la bibliothèque Parcel. J'ai manqué d'annoter @Parcel dans ma sous-classe
la source
En plus des étapes ci-dessus, vous pouvez également vérifier le type de variable. Assurez-vous qu'il s'agit d'une chaîne pour TextView ou de la même chose que celle définie dans le
BindingAdapter
. Par exemple:et en XML:
Cela provoquera l'erreur ci-dessus. Pour résoudre le problème, vous pouvez soit créer la variable age de type String, soit importer String dans votre XML et utiliser
String.valueOf(age)
comme suit:Et dans votre TextView:
la source
Ma solution était de prendre comme suffixe FragmentBinding dans le nom de la classe.
La nomenclature du nom de l'activité ou de la classe de fragments peut varier en termes de préfixes. Parce que le suffixe est toujours contraignant.
Après avoir suivi la réponse de Khemraj et Invalidate Caches / Restart , vous devez réécrire ActivityBinding ou FragmentBinding pour obtenir les suggestions IDE des classes déjà générées et NE PAS coder en dur l'importation.
Dans mon cas, j'essayais d'importer le nom de la classe à l'envers
FragmentCompetitionsBinding
au lieu deCompetitionsFragmentBinding
.GL
La source
la source
Dans mon cas, les classes de liaison de données n'ont pas été générées car j'avais supprimé le répertoire de ressources Android mipmap. J'ai recréé le répertoire res / mipmap / et les classes de liaison de données ont été rétablies.
la source
J'ai rencontré un problème similaire où DataBinding n'a pas réussi à générer la classe BindingImpl . Dans mon cas, il y avait un problème lié à une méthode de la classe de données où le nom était mal utilisé: le modèle contenait une méthode onSignInCliked () et dans la mise en page, j'ai utilisé onSigninCliked () . Notez le SignIn vs Signin .
Le message d'erreur n'était pas suffisant et j'ai découvert le problème uniquement lorsque j'ai utilisé le script de construction avec l'option stack-trace.
la source
Assurez-vous que la liaison de données est activée
dan cliquez sur le bouton (Sync project with Gradle)
la source
S'il y a un problème avec votre fichier XML, la classe Databinding ne sera pas générée. Une solution rapide serait de parcourir le fichier XML et de vérifier les erreurs de syntaxe (qui sont généralement surlignées en rouge). Les erreurs peuvent prendre la forme de références inexistantes ou erronées, d'erreurs typographiques, etc.
Essentiellement, assurez-vous qu'il n'y a pas de ligne soulignée en rouge dans votre code XML. Lorsque vous avez terminé, reconstruisez et votre classe de liaison de données aurait été générée.
la source
1.Ajouter ci-dessous dans l'application gradle
Dans la mise en page xml, écrivez ci-dessous le code
la source
utilisez le chemin de classe 'com.android.databinding: dataBinder: 1.0-rc0'
la source