web-dev-qa-db-fra.com

android: erreur de liaison de données: impossible de trouver la classe de symboles

Je commence à utiliser la fonctionnalité DataBinding. Je suis confronté à un problème avec elle.

Erreur: (21, 9) erreur: impossible de trouver la classe de symboles ContactListActivityBinding

build.gradle (Module: app)

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.letsnurture.ln_202.databindingdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.1.1'
    compile 'com.Android.support:design:23.1.1'
}

ContactListActivity.Java

import Android.databinding.DataBindingUtil;
import Android.os.Bundle;
import Android.support.design.widget.FloatingActionButton;
import Android.support.design.widget.Snackbar;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.Toolbar;
import Android.view.View;
import Android.view.Menu;
import Android.view.MenuItem;

import com.letsnurture.ln_202.databindingdemo.model.Contact;

public class ContactListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
        Contact user = new Contact("Chintan Soni", "+91 9876543210");
        binding.setContact(user);

//        setContentView(R.layout.activity_contact_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_contact_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

content_contact_list.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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"
    tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity"
    tools:showIn="@layout/activity_contact_list">

    <data>

        <variable
            name="user"
            type="com.letsnurture.ln_202.databindingdemo.model.Contact" />
    </data>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:padding="@dimen/activity_horizontal_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.contactName}"
            tools:text="Name" />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.contactNumber}"
            tools:text="Number" />
    </LinearLayout>
</layout>

activity_contact_list.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.letsnurture.ln_202.databindingdemo.ContactListActivity">

    <Android.support.design.widget.AppBarLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:theme="@style/AppTheme.AppBarOverlay">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </Android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_contact_list" />

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom|end"
        Android:layout_margin="@dimen/fab_margin"
        Android:src="@Android:drawable/ic_dialog_email" />

</Android.support.design.widget.CoordinatorLayout>
21
Chintan Soni

c'est ton code

ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);

Remplacer ce code

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
9
Finava Vipul

Je rencontre régulièrement ce problème. Je crois que cela a à voir avec le studio Android ne pas être au courant des fichiers générés dynamiquement. Si tout vous convient pour la liaison de données, essayez Fichier> Invalider les caches/redémarrer ... et sélectionnez Invalider les caches et redémarrer. Ensuite, essayez d'importer le fichier BR ... il devrait être correctement importé.

Vous devrez peut-être ajouter un nettoyage et une reconstruction.

13
feilong

Veuillez vous référer au Guide du développeur Android

Le fichier de mise en forme était main_activity.xml, de sorte que la classe de génération était MainActivityBinding

Puisque votre fichier xml s'appelle "activity_contact_list.xml", vous devez utiliser ActivityContactListBinding au lieu de celui d'origine.

7
GeorgeChen

Vous devez déclarer et transmettre la liaison dans la présentation de l'activité, et non dans la présentation incluse.

Exemple tiré de la documentation :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:bind="http://schemas.Android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       Android:orientation="vertical"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
  </LinearLayout>
</layout>

Ici, il doit y avoir une variable utilisateur dans les fichiers de mise en forme name.xml et contact.xml.

3
yennsarah

J'ai la même erreur, mais avec l'utilisation de Kotlin.

Pour le résoudre, j'apporte quelques modifications aux fichiers Gradles:

Dans le fichier Gradle de project

dependencies {
    classpath "com.Android.tools.build:gradle:3.1.2"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40"
}

Dans le fichier Gradle de app /:

dependencies {

    ...
    implementation "Android.Arch.lifecycle:extensions:1.1.1"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.30"
    kapt 'com.Android.databinding:compiler:3.1.2'
}


kapt {
    generateStubs = true
}

//used to resolve annotation conflicts
configurations.all {
    resolutionStrategy {
        force 'com.Android.support:support-annotations:23.1.1'
    }
}
2
Kevin ABRIOUX

Vous pouvez voir Réponse principale pour des informations complètes sur les erreurs de liaison de données et leurs solutions. Je vais essayer de dire quelques points importants ci-dessous.

5 astuces que j’utilise pour résoudre les problèmes liés.

En supposant que vous avez activé la liaison de données dans build.gradle et que vous avez converti votre mise en page en liaison de mise en page.

Tout d'abord, la classe de liaison est automatiquement générée lorsque vous convertissez la présentation en structure de liaison. Parfois encore, il n'est pas généré lorsque les threads d'arrière-plan ne fonctionnent pas. Voici quelques conseils pour vous aider à résoudre ce problème.

(1) Nom de la classe générée

Le nom de la mise en page est dans snake_caseactivity_main.xml 

La classe de liaison de données sera dans CamelCase comme ActivityMainBinding.

(2). Tapez le nom complet de la classe Binding

Je me sentais parfois lorsque vous tapez ActivityMai..., alors ne montre pas la suggestion, mais que ne signifie pas que la classe est n'est pas générée. Dans ce cas, vous devez saisir le nom complet de la classe générée attendue. Comme le type ActivityMainBinding et il affichera le dialogue d'importation. (C'est ce à quoi j'ai fait face plusieurs fois.) 

Je ne reçois toujours pas de suggestion d'importation. Essayez l'importation manuelle.

import <yourpackage>databinding.ActivityMainBinding;

(3). Reconstruire le projet

Si toujours votre classe n'est pas générée. (Parfois, lorsque nous collons le fichier de présentation, cela se produit). 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 fait de la magie pour moi tous les temps.)

(4) Si vous avez créé un <variable dans votre présentation et que n'apparaît pas dans ses paramètres de lecture et d'acquisition dans la classe de liaison de données, alors suivez le 4e point.

(5) Toujours si votre classe ne génère pas, vous devriez vérifier si la construction n'échoue pas en raison d'une erreur dans votre fichier de présentation. La classe de liaison de données générera avec une construction réussie.

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.

Réponse de la source

2
Khemraj

Vous devez modifier votre activity_contact_list pour qu'il soit lié - ajoutez une balise de mise en page comme vous l'avez fait dans content_contact_list. N'oubliez pas, la mise en page racine dans activity_contact_list doit avoir un identifiant pour que la classe Binding soit générée et sera nommée ActivityContactListBinding (c'est-à-dire le nom de la mise en page avec la diffusion par chameau au lieu de caractères de soulignement).

Ensuite, dans activity_contact_list, donnez à <include layout="@layout/content_contact_list" /> un identifiant, vous aurez alors accès à son instance de liaison par le biais de votre instance ActivityContactListBinding.

Quelque chose comme:

binding.contentContactList.setContact(user);

Laissez-moi savoir si cela fonctionne.

2
Shirane85

Parfois, la raison de ces erreurs n'est pas la DataBinding elle-même, mais une autre partie de notre code. Dans mon cas, une erreur s'est produite dans la base de données Room, de sorte que le compilateur n'a pas pu générer les classes de liaison, ce qui m'a généré ces erreurs.

Selon Google :

Les versions précédentes du compilateur de liaison de données ont généré les classes de liaison dans la même étape que celle qui compile votre code managé. Si la compilation de votre code géré échoue, vous risquez de recevoir plusieurs erreurs indiquant que les classes de liaison ne sont pas trouvées. Le nouveau compilateur de liaison de données empêche ces erreurs en générant les classes de liaison avant que le compilateur géré ne crée votre application.

Donc, pour activer le nouveau compilateur de liaison de données, ajoutez l’option suivante à votre fichier gradle.properties :

Android.databinding.enableV2=true

Vous pouvez également activer le nouveau compilateur dans votre commande gradle en ajoutant le paramètre suivant:

-Pandroid.databinding.enableV2=true

Remarque que le nouveau compilateur dans la version d'Android Studio 3.2 est activé par défaut .

1
Saman Sattari

Point clé

Le nom de votre mise en page est dans snake_case .

activity_login.xml

Votre nom de classe de liaison sera ensuite dans CamelCase .

ActivityLoginBinding.Java

Construisez également le projet après avoir créé la mise en page. Parfois, il n'est pas généré automatiquement.

1
Khemraj

Assurez-vous que le nom de votre modèle et la référence ont le même nom:

Par exemple, nom = "élément" doit correspondre à Android: vérifié = "@ = { élément . Vérifié}"

<data>
    <variable
        name="item"
        type="com.simone.mywordlist.model.MyModel" />
</data>

            <Switch
                Android:id="@+id/my_switch"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:checked="@={item.checked}"
            />
0
live-love

Dans mon cas, il y avait un paquet avec le même nom qu'une importation manquante dans la classe de liaison de données générée. Il semble que le compilateur se soit perdu.

0
tricknology

Je suis tombé dans ce problème car mon activité s'appelait MainActivityMVVM et la liaison a été convertie en MainActivityMvvmBinding au lieu de MainActivityMVVMBinding. Après avoir fouillé dans les classes générées, j'ai trouvé le problème.

0
Pablo