J'utilise la liaison de données dans mon projet, lorsque <layout>
et <data>
dans ma classe de liaison xml ne sont pas générés.
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 une erreur: cette classe n'est pas disponible. Mais après avoir inclus <variable>
dans mon fichier xml, il est capable de générer la classe ActivityMainBinding
.
Android Studio: 2.1.3
Classpath: com.Android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
Je n'ai pas eu de réponse satisfaisante. Voici donc les astuces qui sont un résumé de mes connaissances en liaison de données.
Pour obtenir des erreurs plus précises et des suggestions, il est fortement recommandé de mettre à jour Android Studio et la version du plugin Gradle à la dernière version. Parce que je ne suis pas confronté à beaucoup de problèmes après la version AS 3.2.
Voir Latest Android Studio , et Latest Gradle Plugin .
Après avoir lu cette réponse, vous ne resterez pas coincé dans les problèmes de génération automatique de liaison de données pour les classes et les variables de données.
Vérifiez ces points un par un. Chacun de ces éléments peut rendre votre travail effectué. Les points 3 à dernier sont vraiment importants, alors ne les manquez pas.
La liaison data doit être activée dans build.gradle
. Sinon, ajoutez ceci et Sync.
Android {
...
dataBinding {
enabled = true
}
...
}
Maintenant, si vous voulez que la classe de liaison de données soit générée, vous devez alors wrap xml layout
avec la liaison de données (balise <layout
). Quelque chose comme ça.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
</Android.support.constraint.ConstraintLayout>
</layout>
Votre classe de liaison de données doit être générée après la création d'une présentation de liaison.
Si votre nom de présentation est dans snake case
activity_main.xml
, alors classe de liaison de données sera généré dans camel case commeActivityMainBinding
.
Parfois, lorsque vous tapez ActivityMai...
, alors ne montre pas la suggestion, dans ce cas importer manuellement.
import <yourpackage>databinding.ActivityMainBinding;
Votre classe de liaison et les nouvelles variables de la mise en page ne seront pas générées si votre construction échoue. Donc d'abord Construire le projet par Ctrl + F9 (Construire> Construire le projet).
Je fais toujours cela parce que cela prend beaucoup moins de temps que le projet Rebuild
Make
.
_/Notez que je préfère Fermer et ouvrir à partir de Recent car cela prend beaucoup moins de temps que Rebuild/Restart IDE.
Si toujours votre classe n'est pas générée. (Il arrive parfois que nous collions un fichier de mise en page). Ensuite, Reconstruire le projet à partir de Build> Rebuild
(Pas de construction ni de projet). Il va générer votre classe de liaison de données. (Rebuild is Magic pour moi.)
Après la mise à jour de AS vers Android Studio 3.2 , de nombreuses corrections de bogues ont été détectées lors de la génération automatique de liaisons de données. Donc, vous devriez aussi avoir le dernier AS.
<variables
<data>
<variable
name="item"
type="com.package.Model"/>
</data>
Habituellement, lorsque nous mettons une variable dans une disposition, cela crée un getter et un setter. Et nous pouvons utiliser binding.setItem(item);
et binding.getItem();
, mais si vous ne pouvez pas voir ces méthodes, lisez les informations ci-dessous.
Si vous avez créé une variable de données - <variable
dans votre mise en page et que n'apparaît pas dans ses paramètres de définition et d'obtention dans la classe de liaison de données, alors Fermer et ouvrir à partir de Recent de votre projet.
Si vous avez changé le type de certains <variable
dans votre mise en page et que le type de programme de lecture ne change pas, alors Nettoyer le projet (Build> Clean Project
)
Enfin, si votre classe de liaison n’est toujours pas générée, nous disposons de notre arme la plus puissante. - Redémarrer Android Studio: D
C'est tout ce que je fais pour résoudre mes erreurs de liaison de données. Si vous avez d'autres questions, vous pouvez commenter ici.
Classe DataBinding générée automatiquement.
si votre nom xml est activity_test, la classe de liaison sera ActivityTestBinding.
mais,
dataBinding {
enabled = true
}
la mise en page doit avoir la mise en page en tant que racine
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
</layout>
J'ai eu le même problème. Après avoir lu la documentation sdk Android, il ne reste plus que le nom de fichier attendu à créer, mais vous ne savez pas quoi faire si cela ne se produit pas. Après quelques recherches supplémentaires, j’ai remarqué qu’après avoir supprimé l’espace de nom de l’élément de présentation, comme ci-dessous (avec votre exemple), cela fonctionnait pour moi.
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data> </data>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
</RelativeLayout>
</layout>
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’import de ladite classe à la section d’import/activity/fragment ... alors ... OPTION + ENTRER :)
Après l'avoir correctement configuré (y compris l'espace de noms xml et tout encapsuler dans <layout>
), celui qui fonctionnait pour moi était Build -> Make project. Le projet Nor Clean ou le projet de reconstruction l'ont fait. Je suis dans Android Studio 2.3.1, en utilisant les outils de génération 26.0.2. Il n'y a pas besoin de balises <data>
.
si vous faites un travail de base, pour activer la gestion de données dans votre projet, comme utiliser activer dans gradle et utiliser la balise layout dans xml, lorsque vous modifiez le code xml sans générer de nouvelle classe de liaison de données pour ces fichiers xml utilisez un moyen rapide pour ne générer que la classe de liaison de données dans gradle-> autre-> databindinggenbaseclassesDebug il est plus rapide qu'un projet entier volumineux. sa générer uniquement la classe de liaison de données.
La seule chose que je peux imaginer si possible, c’est si vous n’avez pas
dataBinding {
enabled true
}
dans votre fichier de classement. Sinon, ajoutez-le simplement au fichier Gradle. c'est à dire
Android {
......
dataBinding {
enabled true
}
}
puis synchronisez votre projet. Si le problème persiste, vous devrez peut-être invalider/redémarrer votre studio Android.
Les classes de liaison de données sont générées lors de la construction. Par conséquent, après avoir activé la liaison de données dans la version de Gradle de l'application et entouré votre code 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.
dataBinding {
enabled = true
}
Pour activer le nouveau compilateur de liaison de données, ajoutez l'option suivante à votre fichier gradle.properties:
Android.databinding.enableV2=true
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, mais une date.
Il semble que tous les champs doivent contenir du texte, au moins avec le composant TexView.
Si vous construisez avec la commande ./gradlew build --stacktrace
Cela montre mieux les erreurs.
Lorsque vous travaillez avec une application Android multi-module, vérifiez le chemin de votre classe de liaison. Peut-être devriez-vous utiliser:
import com.yourcompany.app.Android.modulename.databinding.FragmentABCtBinding
au lieu de:
import com.yourcompany.app.Android.databinding.FragmentABCtBinding
Dans mon cas, je pensais que la classe générée devait apparaître avec mes classes habituelles dans le dossier src
. De plus, je pensais que le nom de la classe générée devrait être légèrement différent. C'était tout mon erreur. La classe générée peut être trouvée dans le dossier build
, build -> generated -> ...
chemin. S'il n'y a aucune importation de la classe générée dans votre activité, ajoutez l'importation
import com.yourcompany.app.databinding.ActivityMainBinding;"
J'ai eu un problème similaire où la mise en page et la liaison de données ont été activées dans le fichier Gradle. L'activité principale ne pouvait toujours pas savoir ou voir mes cours. Ce qui a été résolu pour moi, c’est d’ajouter la variable de liaison et d’importer la liaison de toute façon. À partir de là, j'ai simplement construit la solution et ensuite, il a semblé savoir ce que la classe était. À partir de là, j'ai pu importer les classes de cas de chameaux générées.
J'ai eu le même problème. Tout ce que vous avez fait correctement. La chose est que vous devez ajouter la 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.
Jusque-là, vous ne pourrez pas voir ActivityMainBinding généré.
Si vous avez récemment migré votre projet existant vers androidx, vous devez remplacer votre import depuis
import com.yourpackagename.BR;
à
import androidx.databinding.library.baseAdapters.BR;
Après Google 2 jours, j'ai enfin eu ma solution et dans mon cas, cela aide. J'espère que cela vous aidera et vous fera gagner du temps. Si cela fonctionne pour vous alors s'il vous plaît upvote cette solution.
Merci à cette réponse ici - il semble que le "espace de noms de mise en page" doit être effacé ou 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 afin de 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 était 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, celle-ci n'était pas reconnue, même après plusieurs appels d'effacement du cache et de redémarrage. Cependant, dès que j'ai fait une copie de la disposition fragment_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 simplement supprimer le dossier/build du module et de reconstruire le projet - cela fonctionnait pour obtenir la liaison de données pour la présentation d'origine.
Si vous obtenez l'erreur suivante dans DataBindingUtil.setContentView
Référence non résolue: activity_main
tout ce que vous devez faire est de supprimer la déclaration d'importation suivante
importer Android.R
J'ai trouvé la solution sur un autre forum. Source
Je ne sais pas si cela fonctionnera pour vous ou non. Juste renommer le nom du fichier XML de présentation. Par exemple, supposons que votre nom de structure soit activity_main.xml, changez simplement le nom en main.xml puis renommez-le activity_main.xml. Ensuite, vous pouvez voir l’option d’importation sur ActivityMainBinding.
J'espère que ça marche pour toi.
Supprimez les mises en page et annulez-les, puis assurez-vous que les classes de liaison générées sont importées correctement par la suite.