web-dev-qa-db-fra.com

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

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

47
Ravi Rupareliya

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.

Conseils pour résoudre les problèmes de liaison de données

Mettre à jour

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 .

Solution d'origine

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.

1. Vérifier si la liaison de données est activée

La liaison data doit être activée dans build.gradle. Sinon, ajoutez ceci et Sync.

Android {
...
   dataBinding {
        enabled = true
    }
...
}

2. Vérifier que la mise en page est convertie en mise en page obligatoire

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>

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 d'une présentation de liaison. 

Si votre nom de présentation est dans snake caseactivity_main.xml, alors classe de liaison de données sera généré dans camel case comme ActivityMainBinding.

4. Vous ne pouvez pas voir la suggestion d'importation?

Parfois, lorsque vous tapez ActivityMai..., alors ne montre pas la suggestion, dans ce cas importer manuellement

    import <yourpackage>databinding.ActivityMainBinding;

5. Lecture Build Fail Logcat

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

  • Si la construction échoue, voyez ce qui est une erreur, nous avons généralement des erreurs dans les champs de présentation. Les journaux d'erreur indiqueront le numéro de ligne d'erreur en cause.
  • La liaison peut fail provoquer une erreur stupid, telle qu'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 logcat complet pour trouver le problème approprié.

6. Fermer et ouvrir le projet de la récente

Je fais toujours cela parce que cela prend beaucoup moins de temps que le projet RebuildMake.

  • Fermer le projet depuis Fichier> Fermer le projet
  • Ouvrir à nouveau de récente 

_/Notez que je préfère Fermer et ouvrir à partir de Recent car cela prend beaucoup moins de temps que Rebuild/Restart IDE.

7. Projet de reconstruction

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

8. Avoir le dernier Android Studio

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.

Solution pour <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.

1. Fermer et ouvrir le projet de la récente

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. 

2. Nettoyer le projet après avoir changé de type

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)

Mots finaux

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

  • Commencez par essayer just restart, cela génère toujours les variables de ma mise en page après le redémarrage.
  • Si ne fonctionne pas, alors Invalidate Cache & Restart.

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.

60
Khemraj

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>
18
ViramP

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> 
8
ngaspama

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

7
Krzysztof Kubicki

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

6
Xtreme Biker

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.  enter image description here

2
Mahdi Azadbar

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.

1
Hassan Semiu Ayomon

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.

1
Schadenfreude
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
1
Samir Mangroliya

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.

0
jactive

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;"
0
Kseniya

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.

0
stegnerd

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

0
Srinivasan

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.

0
Milan Sheth

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:

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

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

0
Gene Bo

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

0
Tim John

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. 

0
Sudhansu

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.

0
Ahmed AlAskalany