web-dev-qa-db-fra.com

Android - DataBinding - Comment et quand les classes de Binding seront-elles générées?

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 

53
sowmia

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. 

75
Mao

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.

32
Frank Cheng

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.

25
yigit

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

12
surlac

Règle

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 être ActivityHomeBinding.class.

Problème

  1. Souvent, la suggestion d'importation de la classe DataBinding ne vous est pas proposée. 
  2. La classe de liaison n'est pas générée en cas de problème de mise en page. 
  3. Les classes de liaison ne sont pas disponibles en cas d'échec de la construction

Voici bidouille

Lorsque vous n'obtenez pas de suggestion d'importation

  • 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;
    

La ligne d'importation affiche toujours une erreur?

  • Si votre ligne d'importation indique une erreur, essayez alors make projet (ctrl + F9)/Build> Make Project. .
    1. Si la construction échoue à cause d'une erreur, résolvez-la.
    2. Si la construction réussit, la classe de liaison sera générée.

Quick hack pour générer une classe de liaison

  • Si votre classe de liaison n'est pas générée, close project (Fichier> Fermer le projet) et open from recent.

Notez que je recommande fermer et ouvrir depuis récent car il prend moins de temps que Reconstruire/Redémarrer IDE.

Rapide hack pour générer des variables de mise en page dans la classe de liaison

  • Si vos variables de mise en page ne sont pas générées, alors close project (Fichier> Fermer le projet) et open from recent.

Si vous avez toujours des problèmes. Faites-moi savoir dans les commentaires, ou voir cette réponse pour une meilleure compréhension.

8
Khemraj

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>
4
Bharatesh

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.

4
CodyF

Dans mon cas, le redémarrage d'Android Studio fonctionne. C'est un bug dans Android-apt

3
user3871754

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.

1
IsaiahJ

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

1

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

1
Someone Somewhere

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: 

  1. classpath "com.Android.databinding: dataBinder: 1.0-rc4" -> inclure ceci dans le fichier de construction main module
  2. plugin apply: 'com.Android.databinding' à votre module app que vous construisez
  3. Nettoyer
  4. Reconstruire. Vérifiez sous, si build-> indermediates-> le nom de votre paquet-> databinding est généré et contient la classe ActivityMainBinding.

Alternativement, si vous voulez voir la source générée.

  1. classpath 'com.neenbedankt.gradle.plugins: Android-apt: 1.7' -> s'applique à votre module principal.
  2. apply plugin: 'com.neenbedankt.Android-apt' -> à votre module d'application
  3. apt 'com.Android.databinding: compiler: 1.0-rc0' -> inclure dans vos dépendances.

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 .

1
ashish bulchandani

vérifier le niveau d'accès aux champs de votre objet, quand j'ai rendu public ça a marché ici

0
Kleyton Santos

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>
0
Qasim

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

0
tick t

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.

0
Aurélien Lemaitre
<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

// Rappelez-vous le besoin Build-> Rebuild Project

0
a442509097