web-dev-qa-db-fra.com

Impossible de résoudre la classe de liaison de données Android

Lors de l'utilisation de la liaison de données, je ne parviens pas à obtenir la classe MainActivityBinding selon Guide de liaison des données

Mon nom de présentation est activity_main.xml. Je vois aussi Android - DataBinding - Comment et quand les classes de liaison seront-elles générées? mais ça ne peut pas m'aider.

31
pRaNaY

Merci à tous pour votre réponse.J'ai trouvé une solution avec ContentMainBinding nom de classe pour la liaison de données . Permettez-moi de vous expliquer.

REMARQUE: Lors de l'utilisation de la présentation avec<include ...voici que <include layout="@layout/content_main" possède la fonctionnalité de liaison de données, le nom de classe associé à l'inclusion du nom de la présentation. Voici la ContentMainBinding

Mon fichier de mise en page est comme ci-dessous:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:context="com.databindingdemo.app.MainActivity">
    ...
    <include layout="@layout/content_main" />
    ...
    </Android.support.design.widget.CoordinatorLayout>

Et content_main.xml est la mise en page à laquelle j'ai ajouté mon code de mise en page Liaison de données.

Donc, au lieu d'utiliserMainActivityBindingil peut être résolu avecContentMainBinding

Le code qui fonctionne pour moi est ci-dessous:

//Code for data binding
    ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
    user = new User("Pranay", "Patel", "[email protected]", "9999999999");
    contentMainBinding.setUser(user);

TERMINÉ.

17
pRaNaY

La classe DataBinding sera générée en fonction de votre nom de fichier XML. Il est clairement mentionné dans le document que vous suivez.

Par défaut, une classe de liaison sera générée en fonction du nom du fichier de présentation, le convertissant en casse Pascal et complétant le suffixe «Liaison». Le fichier de présentation ci-dessus était main_activity.xml, de sorte que la classe de génération était MainActivityBinding

Si votre nom xml est activity_main.xml, le nom de la classe DataBinding sera ActivityMainBinding.

Si votre nom xml est main_activity.xml, le nom de la classe DataBinding sera MainActivityBinding.

N'oubliez pas de nettoyer et de construire le projet une fois

vous pouvez suivre ce tutoriel pour en savoir plus sur DataBinding

66
Rocky

TRY Renommez le fichier xml en un autre nom et vérifiez si la liaison fonctionne une fois que cela fonctionne, renommez-le ainsi.

Cela a aidé pour Android Studio 3.1

19
Ismail Iqbal

J'ai nettoyé le projet, la reconstruction a été effectuée ... mais inutile ... puis annulé les caches et redémarré le projet qui ne m'a pas aidé non plus.

Ensuite, j'ai changé le nom de mon fichier XML - cela fonctionnait à merveille.

Donc, je voudrais vous partager une chose, s'il vous plaît changer votre nom de fichier XML.

Par exemple: Si votre fichier xml est: activity_main.xml et que vous ne pouvez pas obtenir ActivityMainBinding dans sa classe Java .......... changez le nom xml en main_activity.xml, puis utilisez MainActivityBinding dans sa classe Java en tant que 'private MainActivityBinding binding;'

Cela fera très probablement.

6
Musthafa

Si le nom de la classe DataBinding est correct et que vous aviez l'habitude de nettoyer et de reconstruire le projet, mais que l'erreur persiste.
Puis vous essayez de redémarrer AndroidStudio

6
Linh

Dans de tels cas, si ni la reconstruction ni l'invalidation ne fonctionnent, il doit y avoir une erreur dans l'un de vos fichiers xml où vous avez peut-être utilisé @ {xyz.abc} et il doit y avoir un problème avec xyz ou abc dans xml.

5
Rohan Taneja

Vérifiez que le xml et la classe de votre activité/fragment ont des noms cohérents; Par exemple, si vous avez TimePickerFragment, le nom du fichier xml doit être time_picker_fragment.

Je me suis dit que la disposition s'appelait fragment_time_picker; après que je l'ai changé la liaison a été générée.

4
AAryz

La classe de liaison sera générée en fonction du nom de votre fichier de mise en page. Par Par défaut, le nom de la classe est basé sur le nom de la présentation fichier, en le convertissant en cas Pascal et en y ajoutant le suffixe Binding

par exemple, .__ Si votre nom xml est activity_main.xml, le nom de la classe DataBinding sera ActivityMainBinding

puis importez le package:

import com.companyname.applicationname.databinding.ActivityMainBinding;

alors vous pouvez l'utiliser

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Test", "User");
binding.setUser(user);
3
Alen Lee

Dans mon cas, supprimer le dossier de construction de l'application, puis reconstruire le projet a résolu mon problème.

Même les étapes suivantes n'ont pas fonctionné.

          1) Rebuild the project after adding the dataBinding  in gradle.

          2) Rebuild after adding layout tag in xml.

          3) cleaning the project

          4) rebuilding the project

          5) Restarted the Android Studio

Après avoir activé le fichier data grading dans le fichier d'application, veuillez reconstruire. Ensuite, nous pouvons trouver la classe Binding générée. 

          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
2
Thriveni

J'ai eu le même problème après avoir changé le nom du paquet de ma source, après avoir essayé beaucoup de choses (y compris celles mentionnées ici), j'ai résolu le problème en important manuellement la classe de liaison de données:

import com.domain.my.databinding.MyActivityBinding;
2
hiddeneyes02

Par défaut, une classe de liaison est générée en fonction du nom du fichier de mise en page. Elle commence par une majuscule, supprime les traits de soulignement (_), met la lettre suivante en majuscule, puis suffixe «Binding».

Cette classe sera placée dans un paquet de liaison de données sous le paquet de module. 

Par exemple, le fichier de configuration contact_item.xml générera ContactItemBinding

Si le module est com.example.my.app, il sera placé dans com.example.my.app.databinding

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. Par exemple:

<data class="ContactItem">
    ...
</data>

Cela génère la classe de liaison en tant que ContactItem dans le package databinding du package de module. Si la classe doit être générée dans un package différent du package de module, il peut être précédé de “.”:

<data class=".ContactItem">
    ...
</data>

Dans ce cas, ContactItem est généré directement dans le module. Tout package peut être utilisé si le package complet est fourni:

<data class="com.example.ContactItem">
    ...
</data>
1
Priyank Patel

Je ne peux pas commenter, donc je vais juste ajouter ceci dans la réponse. Je crois que activity_main.xml créera ActivityMainBinding plutôt que MainActivityBinding comme vous l'avez mentionné. dans certains cas, lorsque studio ne trouve pas la classe de liaison, il suffit d'invalider les caches et de reconstruire le projet. 

1
Ankit

Redémarrez Android Studio ou essayez de renommer le fichier XML en un autre nom et vérifiez si la liaison fonctionne une fois que cela fonctionne.

1
Brahem Mohamed

J'ai essayé les solutions suivantes qui ne fonctionnaient pas pour moi: 1) Invalider le cache et redémarrer . 2) Redémarrez Android Studio . 3) Reconstruisez le projet.

Ce que DID corrige le problème est le suivant: 1. Suppression de la balise "dataBinding" dans le module gradle.build 2. Projet de synchronisation 3 Renvoie la balise "databinding" 4. Synchroniser le projet à nouveau.

0
Nativ

Essayez de redémarrer Android Studio ou de rechercher manuellement la classe ActivityMainBinding et d'ajouter votre import.

Mettez votre balise de données dans votre dernier xml inclus . Voici un exemple:

MainActivity.Java
public class MainActivity extends AppCompatActivity {

    public Item item;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        item = new Item();
        item.setChecked(true);
        item.setName("a");
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.included.secondIncluded.setModel(item);


Item.Java
public class Item extends BaseObservable {
    private String name;
    private Boolean checked;
    @Bindable
    public String getName() {
        return this.name;
    }
    @Bindable
    public Boolean getChecked() {
        return this.checked;
    }
    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    public void setChecked(Boolean checked) {
        this.checked = checked;
        notifyPropertyChanged(BR.checked);
    }
}


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/tv_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="abc"
            Android:textSize="20sp" />
        <include
            Android:id="@+id/included"
            layout="@layout/included_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />
    </LinearLayout>
</layout>


included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/tv_title2"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="123"
            Android:textSize="20sp" />
        <include
            Android:id="@+id/second_included"
            layout="@layout/second_included_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />
    </LinearLayout>
</layout>

second_included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <data>
        <variable
            name="model"
            type="com.example.simone.twowaydatabinding.Item" />
    </data>

    <LinearLayout
        Android:id="@+id/linear_layout_included"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <TextView
            Android:id="@+id/tv_title1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="xyz"
            Android:textSize="20sp" />
        <TextView
            Android:id="@+id/tv_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@={model.name}"
            Android:textSize="20sp" />
        <Switch
            Android:id="@+id/switch_test"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:checked="@={model.checked}" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="change"
            Android:onClick="button_onClick"/>
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/world"/>
    </LinearLayout>
</layout>       
0
live-love