Guide de liaison de données Etats
By default, a Binding class will be generated based on the name of the layout
file, converting it to Pascal case and suffixing “Binding” to it.
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.
Quand la classe Binding, ici, ActivityMainBinding, sera-t-elle générée? J'ai une erreur de compilation. "ne peut pas résoudre ActivityMainBinding".
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
Toute aide est appréciée. Merci
Quel est votre nom de mise en page?
Le fichier de présentation ci-dessus était activity_main.xml, de sorte que la classe de génération était ActivityMainBinding.
Cela signifie que le nom de la classe générée dépendra du nom de votre mise en page.
activity_main.xml -> ActivityMainBinding.Java
Je pense que le nom de votre activité est "main_activity", le nom de la classe de liaison générée doit donc être MainActivityBinding et non ActivityMainBinding.
Lorsqu'il ne génère pas la classe de liaison, je redémarre Android Studio. Ensuite, la classe de liaison sera générée. N'est-ce pas causé par le cache du studio Android?
BTW, si vous utilisez Android-apt
, veuillez le vérifier. Parce que la classe de liaison ne sera pas générée.
Avez-vous mis à jour votre fichier de présentation pour la liaison de données? Ils ne sont générés que pour les modèles comportant une liaison de données.
Il doit commencer par une balise layout
qui a 2 balises enfants (données et votre vue racine).
Quelque chose comme ça:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout ...
</LinearLayout>
</layout>
Lorsque votre mise en page présente ce formulaire, AndroidStudio doit automatiquement terminer le cours. De plus, par défaut, il est généré dans le package <your.app.package>.databinding
.
Essayez de renommer la disposition en main_activity.xml
.
Dans mon cas, générer une classe de liaison pour "activity_main.xml" n'a pas fonctionné.
Mais renommer le fichier de présentation en main_activity.xml
a parfaitement fonctionné.
Le nom de la structure est dans snake_case
, et le nom de la classe de liaison générée sera CamelCase
.
Si votre nom de présentation est
activity_home.xml
, le nom de la classe de liaison sera alors êtreActivityHomeBinding.class
.
Lorsque vous ne recevez pas de suggestion d'importation. Importez manuellement votre classe de liaison comme ceci. (Souvent, l'IDE ne montre pas de suggestions pour les classes de liaison)
import <yourpackage>databinding.ActivityMainBinding;
Notez que je recommande fermer et ouvrir depuis récent car il prend moins de temps que Reconstruire/Redémarrer IDE.
Si vous avez toujours des problèmes. Faites-moi savoir dans les commentaires, ou voir cette réponse pour une meilleure compréhension.
Si vous avez toujours voulu donner votre propre nom de classe Binding, ajoutez simplement l'attribut class
à l'élément data
avec le nom de classe
Les classes de liaison peuvent être renommées ou placées dans des packages différents en ajustant l'attribut de classe de l'élément de données.
<data class="ContactItem">
...
</data>
<data class="com.example.ContactItem">
...
</data>
Assurez-vous que la disposition de la:
<data>
<variable name="user" type="com.example.User"/>
</data>
Est dans activity_main.xml si vous recherchez ActivityMainBinding. Dans la plupart des projets standard, vous définissez votre vue de contenu sur activity_main.xml, puis vous gonflez fragment_main.xml.
Si vous mettez votre <data>
dans fragment_main.xml layout, la classe générée sera FragmentMainBinding .
Remarque: Cela peut sembler évident après lecture, mais vous pouvez facilement passer à côté de cette tâche en suivant la documentation Android.
Dans mon cas, le redémarrage d'Android Studio fonctionne. C'est un bug dans Android-apt
Un simple redémarrage n'a pas fonctionné pour moi. Je devais Invalidate Caches and Restart
puis je pouvais voir les classes de liaison. C'est dans le menu File
pour ceux qui ne savent pas.
Pour que la liaison de données Android fonctionne correctement, vous devez utiliser les outils Android pour gradle (com.Android.tools.build:gradle)> = 1.3.0.
Donc, votre projet build.gradle doit ressembler à:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:1.3.0'
classpath "com.Android.databinding:dataBinder:1.0-rc1"
}
}
allprojects {
repositories {
jcenter()
}
}
Et le module build.gradle doit avoir ce plugin:
apply plugin: 'com.Android.databinding'
Après tout, vérifiez dans votre module que vous utilisez la dernière version de buildToolsVersion (actuellement 22.0.1). Je ne suis pas sûr que cela soit nécessaire, mais cela vous fera peut-être sentir que vous êtes à la pointe de la technologie. ^ _ ^:
buildToolsVersion '22.0.1'
Resynchronisez et reconstruisez votre projet . Il est probable que sans reconstruction du projet, les classes SomeLayoutBinding
ne soient pas générées.
Dans Android Studio, vous pouvez le faire depuis le menu de l'application: Build -> Rebuild project
D'après mon expérience, Android Studio 3.1.3 a généré la classe de liaison de données après avoir cliqué sur "Construire> Rebuild Project". Le fichier a été stocké dans:
\ Projet\app\build\généré\source\apt\développement\debug\projet\Android\app\databinding
Cependant, Android Studio still a signalé la classe de liaison comme "Inconnu" dans le code source.
Pour finalement le réparer, je manuellement ai ajouté le import instruction:
import project.Android.app.databinding. *;
Face au même problème.
La raison pour «ne peut pas résoudre ActivityMainBinding» est que votre fichier de liaison n’est pas généré. Essayez de nettoyer et de reconstruire le projet . Assurez-vous également que vous avez suivi les étapes suivantes:
Alternativement, si vous voulez voir la source générée.
Ces classes seront générées lors de la première construction . Assurez-vous également que applicationId dans votre module d'application est identique au nom package dans AndroidManifest.xml de votre module d'application . J'espère que cela vous aidera .
vérifier le niveau d'accès aux champs de votre objet, quand j'ai rendu public ça a marché ici
Dans mon cas, je viens de placer ma mise en page XML dans des balises <layout></layout>
et le tour est joué, sans ajouter la balise data, j’ai réussi à générer des liaisons de données. J'espère que cela t'aides.
<data>
<variable name="user" type="com.example.User"/>
</data>
Si vous ne souhaitez pas redémarrer Android studio, vous pouvez renommer activity_main.xml en un autre nom, par exemple activity_m.xml, puis le renommer à nouveau activity_main.xml. C'est beaucoup plus rapide que de redémarrer Android Studio.
Pour renommer, faites un clic droit sur activity_main.xml et choisissez Refactor => Renommer
Un "bogue" étrange dans Android-studio empêche le fichier BR.Java généré d'utiliser les champs @Bindable
et de ne posséder que la propriété _all
s'il n'existe pas de répertoire res/layout.
Il m'est arrivé de créer une application "Aucune activité" pour disposer d'une bibliothèque contenant mes différentes données pouvant être liées.
<data class="MainActivityBinding">
<variable
name="user"
type="com.example.administrator.my_mvvm.User" />
</data>
// Rappelez-vous le besoin Build-> Rebuild Project