J'essaie la nouvelle bibliothèque de liaison de données. J'ai un problème étrange où lier la propriété visibility
ne compile pas.
Ceci est une version simplifiée du fichier XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable
name="header"
type="com.example.EmailHeader" />
</data>
<RelativeLayout ... >
<TextView
...
Android:text="@{header.senderName ?? header.senderAddress}"
Android:visibility="@{header.hasAttachment ? View.VISIBLE : View.INVISIBLE}" />
</RelativeLayout>
</layout>
Je reçois le message suivant lors de la compilation:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Java.lang.RuntimeException: erreurs de liaison de données détectées. ****/data binding error **** msg: les identificateurs doivent avoir des types définis par l'utilisateur à partir du fichier XML. Il manque la vue
Tout est compilé (et fonctionne!) Lorsque je supprime le Android:visiblity
déclaration.
Je ne vois pas ce qui me manque ici
À l'intérieur de la balise de données, vous devez également ajouter:
<import type="Android.view.View" />
Problème persistant malgré l'ajout de <import type="Android.view.View" />
à ma balise de données.Enfin, l'erreur a été provoquée par une incompatibilité de nom de variable et d'objet de ma classe POJO.
C'était ma balise de données:
<data>
<import type="Android.view.View" />
<variable
name="employee"
type="com.example.Employee"/>
</data>
et j'utilisais:
<TextView
...
Android:text="@{user.lastName}" />
au lieu de:
<TextView
...
Android:text="@{employee.lastName}" />
J'ai oublié de le changer après avoir copié le code de la documentation. Recherchez les erreurs comme celle-ci qui sont difficiles à détecter pour les débutants dans DataBinding
J'ai été confronté exactement à la même erreur, due au fait que l'objet POJO se trouvait dans un projet de bibliothèque.
Il suffit de mettre à jour le build.gradle de la bibliothèque pour activer la liaison de données ainsi que dans le projet principal:
dataBinding {
enabled = true
}