Classe de liaison de données non générée

97

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 ActivityMainBindingdans 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 ActivityMainBindingclasse.

Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Ravi
la source
2
est dataBinding.enableddans votre build.gradle?
pskink le
2
Je pense que c'est une erreur connue. Vous pouvez essayer de construire votre projet avant d'essayer d'y accéder ActivityMainBinding, ou il doit faire quelque chose avec ce bogue.
yennsarah
@pskink oui, c'est pourquoi il génère une classe de liaison après l'ajout <variable>en xml
Ravi
@Amylinn après avoir construit mon projet qu'il génère, mais ma question est quand j'écris <variable>, il génère une classe de liaison sans construire de projet.
Ravi le
ah, en effet, j'ai raté ça
pskink

Réponses:

216

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

Après avoir lu cette réponse, vous ne serez pas bloqué 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. 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 .

android {
...
   dataBinding {
        enabled = true
    }
...
}

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 layoutavec la liaison de données ( <layoutbalise). 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>

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.

Si votre nom de mise en page est dans le cas du serpent, activity_main.xml la classe de liaison de données sera générée dans le cas du camel comme ActivityMainBinding.

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 .

import <yourpackage>databinding.ActivityMainBinding;

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) .

  • Si une construction échoue, voyez ce qu'est une erreur, nous avons généralement des erreurs dans les champs de mise en page. Les journaux d'erreurs indiqueront le numéro de ligne d'erreur avec le problème.
  • La liaison peut échouer et provoquer une erreur stupide , comme une erreur de syntaxe ou une importation manquante. Dans ce cas, vous obtiendrez logcat plein d'erreurs de classes de liaison. Mais vous devriez lire le logcat complet pour trouver le problème approprié .

6. Fermez et ouvrez le projet de

Je fais toujours cela car cela prend beaucoup moins de temps que Rebuild/ Makeproject.

  • Fermer le projet à partir du fichier> Fermer le projet
  • Ouvrir à nouveau depuis récent

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

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

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);et binding.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 - <variabledans 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 <variabledans 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

  • Tout d'abord, essayez de redémarrer , cela génère toujours des variables de ma disposition de liaison après le redémarrage.
  • Si cela ne fonctionne pas, invalider le cache et redémarrer .

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.

Khemraj
la source
2
Si le problème persiste ... (8) Invalidate & restart .... si non résolu, (9) change dataBinding {enabled = false} ... build, puis dataBinding {enabled = true} build à nouveau ....
PravyNandas
1
Dans mon cas, j'ai dû importer le chemin de classe manuellement pour une raison quelconque, l'EDI ne l'affiche pas comme une solution. Tnx :)
Ivan Kaloyanov
2
J'ai sauvé ma journée. Il me manquait l'encapsulation <layout> dans mon fichier de mise en page. Je vous remercie!
Juliano
Vous pouvez également ajouter que le "import android.R" doit être supprimé, s'il fait partie de la liste d'importation. Cela a résolu mon problème avec la référence non résolue au fichier xml d'activité
Tim John
23

Classe DataBinding générée automatiquement.

si votre nom xml est activity_test, la classe Binding 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>
ViramP
la source
Je cherche l'âme pendant des heures, je fais beaucoup de magie gradle, mais je l'utilise ConstraintLayoutcomme racine. Je vous remercie!
Alexey Markov
14

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.

    <?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> 
ngaspama
la source
10

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 :)

Krzysztof Kubicki
la source
2
Bingo, a fonctionné pour moi, même si j'ai dû taper l'importation manuellement, intellisense n'offrait pas l'option pour une raison quelconque.
Rob
8

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.

Motard Xtreme
la source
Cela devrait être marqué comme la bonne réponse. Le repos ne sont que des solutions de contournement. Pas besoin de déplacer les espaces de noms ou même d'ajouter des éléments de données
Vicky Kapadia
8

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. entrez la description de l'image ici

Mahdi Azadbar
la source
4
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
Samir Mangroliya
la source
3

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.

Schadenfreude
la source
2

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:

  1. 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 page fragment_abc2.xml, j'ai immédiatement obtenu l'objet .java / .class de liaison de données généré.

  2. 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.

Gene Bo
la source
1

La seule chose que je peux imaginer si possible, c'est si vous n'avez pas

dataBinding {
    enabled true
}

dans votre fichier gradle. Sinon, ajoutez-le simplement au fichier gradle. c'est à dire

android {
  ......

  dataBinding {
    enabled true
  }
}

puis synchronisez votre projet. Si cela échoue toujours, vous devrez peut-être faire Invalider / Redémarrer votre studio Android

Hassan Semiu Ayomon
la source
J'ai clairement mentionné dans ma question qu'après l'ajout <variable>en xml, il génère une classe de liaison, il n'y a donc aucun cas de ne pas ajouter dataBindingde fichier gradle, si je n'ai pas ajouté, cela ne devrait pas générer de classe de liaison.
Ravi
Avant la synchronisation et le redémarrage. Veuillez essayer de «faire». Cela va fonctionner.
Nizamudeen Sherif
1

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.

Sudhansu
la source
1

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

Kosiara - Bartosz Kosarzycki
la source
1

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.

Ahmed AlAskalany
la source
0

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é.

Srinivasan
la source
0

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.

stegnerd
la source
0

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.

jactive
la source
0

Dans mon cas, je pensais que la classe générée devait apparaître avec mes classes habituelles dans le srcdossier. 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 le builddossier, build -> generated -> ...chemin. S'il n'y a pas d'importation de la classe générée dans votre activité, ajoutez l'importation

import com.yourcompany.app.databinding.ActivityMainBinding;"
Kseniya
la source
0

Au cas où vous obtenez l'erreur suivante dans DataBindingUtil.setContentView

Référence non résolue: activity_main

tout ce que vous avez à faire est de supprimer la déclaration d'importation suivante

importer android.R

J'ai trouvé la solution sur un autre forum. La source

Tim John
la source
0

Si récemment un projet existant a migré vers androidx, vous devez remplacer votre importation de

import com.yourpackagename.BR;

à

import androidx.databinding.library.baseAdapters.BR;

Après Google, 2 jours ont finalement eu une solution, laquelle fonctionne pour moi.

Milan Sheth
la source
1
Non. Ressource de liaison ( .BR. ) Comme Ressource ( .R. ). Il est généré en fonction de la ressource de votre projet (id, dessinable, couleur, ...) afin qu'il se place dans votre package de projet ( your.project.package.BR). Pas à l'intérieur d'une bibliothèque tierce comme androidx.databinding.library.baseAdapters.BR.
dphelins
0

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.

Uzair
la source
0

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

Ranjith Kumar
la source
0

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:

data class MyDataObject(val name: String, val age: Int)

et en XML:

android:text="@{dataobject.age}"

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:

<data>
    <import type="String" />
...
</data>

Et dans votre TextView:

android:text="@{String.valueOf(dataobject.age)}"
timide
la source
0

Ma solution était de prendre comme suffixe FragmentBinding dans le nom de la classe.

Une classe de liaison est générée pour chaque fichier de mise en page. Par défaut, le nom de la classe est basé sur le nom du fichier de mise en page, en le convertissant en cas Pascal et en y ajoutant le suffixe Binding. Le nom de fichier de mise en page ci-dessus est activity_main.xml, donc la classe générée correspondante est ActivityMainBinding. Cette classe contient toutes les liaisons des propriétés de mise en page (par exemple, la variable utilisateur) aux vues de la mise en page et sait comment attribuer des valeurs aux expressions de liaison.

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 FragmentCompetitionsBindingau lieu de CompetitionsFragmentBinding.

GL

La source

Braian Coronel
la source
0

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.

buggly
la source
0

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.

Ionut Negru
la source
0

Assurez-vous que la liaison de données est activée

android {
...
   dataBinding {
        enabled = true
    }
...
}

Projet de synchronisation avec gradle dan cliquez sur le bouton (Sync project with Gradle)

fahrizal89
la source
0

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.

Taslim Oseni
la source
-1

1.Ajouter ci-dessous dans l'application gradle

 dataBinding {
        enabled = true
    }

Dans la mise en page xml, écrivez ci-dessous le code

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.
Rohan Lodhi
la source
3
Pourquoi dataBinding nécessiterait-il une autorisation Internet, dans un cas général?
M.Pomeroy du
1
@ M.Pomeroy oui ce n'est pas obligatoire, pas édité la réponse merci
Rohan Lodhi
-5

utilisez le chemin de classe 'com.android.databinding: dataBinder: 1.0-rc0'

Sumanta Banerjee
la source
pour gradle 1.5.0 et supérieur, il n'est pas nécessaire d'utiliser ce chemin de classe.
Ravi le