web-dev-qa-db-fra.com

impossible de trouver le symbole BR dans la liaison de données Android

Je veux utiliser Android Data Binding et a configuré conformément au document officiel.

le message d'erreur est le suivant: erreur: impossible de trouver le symbole import net.juude.droidviews.BR;

le fichier build.gradle de niveau supérieur est:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.Android.tools.build:gradle:1.3.0-beta2"
        classpath 'me.tatarka:gradle-retrolambda:3.0.1'
        classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.4'
        classpath "com.Android.databinding:dataBinder:1.0-rc0"
    }
}
allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}

et le fichier build.gradle dans le module d'application est

apply plugin: 'com.Android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.Android-apt'
apply plugin: 'com.Android.databinding'


Android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    lintOptions {
        abortOnError false
    }

    defaultConfig {
        applicationId "net.juude.droidviews"
        minSdkVersion 15
        targetSdkVersion 22 
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
        }
    }
    retrolambda {
        println("Java_HOME: " + System.getenv("Java_HOME"))
        println("Java7_HOME: " + System.getenv("Java7_HOME"))
        println("Java8_HOME: " + System.getenv("Java8_HOME"))
        javaVersion JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile project(':ptr-lib-debug')
    compile project(':library')
    compile 'com.Android.support:support-v4:22.1.0'
    compile 'com.mcxiaoke.volley:library:1.0.+'
    compile files('libs/droidmocks.jar')
    compile 'com.Android.support:support-annotations:22.1.1'
    compile 'com.facebook.fresco:fresco:0.5.0'
    compile 'com.Android.support:recyclerview-v7:22.1.1'
    compile 'io.reactivex:rxandroid:0.24.0'
    compile 'io.reactivex:rxjava:1.0.6'
    compile 'com.google.dagger:dagger:2.0'
    apt 'com.google.dagger:dagger-compiler:2.0'
}

le fichier de mise en page est 

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="user" type=" net.juude.droidviews.databinding.User" />
    </data>
    <LinearLayout
        Android:orientation="vertical" Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <TextView
            Android:id="@+id/user_name"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.mName}"/>

        <TextView
            Android:id="@+id/user_sex"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.sex}"/>

    </LinearLayout>
</layout>

le fragment est

package net.juude.droidviews.databinding;

import Android.databinding.DataBindingUtil;
import Android.databinding.ViewDataBinding;
import Android.os.Bundle;
import Android.support.annotation.Nullable;
import Android.support.v4.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;

import net.juude.droidviews.BR;
import net.juude.droidviews.R;

/**
 * Created by juude on 15-6-9.
 */
public class DataBindingFragment extends Fragment{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewDataBinding dataBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data_binding, container, false);
        //dataBinding.setVariable(BR.)
        User user = new User();
        user.setSex("男");
        user.setName("Juude");
        dataBinding.setVariable(BR.user, user);
        return dataBinding.getRoot();
    }
}

étant donné que je n'ai pas eu d'erreur de syntaxe dans Android Studio, je peux supposer qu'Android Studio peut reconnaître la classe BR;

Mais lorsque je compile le projet, il me dit que error:cannot find symbol class BR.

je souhaite donc savoir comment faire pour générer le fichier BR.Java approprié.

32
Juude

C'est un problème causé par le plugin Android-apt. Il ignore la dépendance fournie par le plug-in de liaison de données.

https://bitbucket.org/hvisser/Android-apt/issue/38/Android-apt-breaks-brand-new-data-binding#comment-18504545

Vous pouvez contourner ce problème en ajoutant: apt 'com.Android.databinding:compiler:1.0-rc0 à votre fichier Gradle.

20
yigit

Dans le cas où quelqu'un a toujours ce problème. J'ai résolu ce problème en invalidant le cache dans Android Studio. Et j'utilise Android Studio 2 avec API 23

Fichier> Invalider les caches/redémarrer

29
Hybrid SyntaX

Je trouve la cause du problème dans mon cas. Je trouve dans les instructions d'importation de ma classe d'objet de données contient:

import static Android.databinding.tool.util.GenerationalClassUtil.ExtensionFilter.BR;

Le problème est résolu après que j'ai enlevé cela. Android Studio a en quelque sorte résolu mal la classe BR.

7
David Cheung

L'annotation Bindable génère une entrée dans le fichier de classe BR lors de la compilation. Le fichier de classe BR sera généré dans le package de module. 

@Bindable
   public String getFirstName() {
       return this.firstName;
   }
6
App-SoftwareFactory

J'ai rencontré ce problème aussi. Le problème était que j'ai changé le nom de la classe et que je n'ai pas mis à jour les valeurs du fichier XML. Cela inclut les noms de variables et leur accès dans le fichier XML.

4
Nick

Pour mon cas, le problème a été causé par 

"erreur: la variable MyVariable était déjà définie dans la classe MyModel"

La chose gênante était que Android Studio gradle build n’affiche pas cette erreur en bas. Je devais commenter chaque erreur de liaison de données> Reconstruire le projet jusqu'à atteindre l'erreur. La leçon à retenir était de parcourir chaque erreur de bas en haut et de noter tout ce que vous avez pu changer récemment.

4
Hau Le

Moi aussi j'ai eu le même message d'erreur, mais ma cause fondamentale était différente de ce qui a été partagé ici. 

Dans mon cas, le problème était qu’après avoir résolu un conflit de fusion, j’avais laissé par erreur une annotation supplémentaire @Override sur une méthode. Ainsi, le préprocesseur de la machine virtuelle Java a échoué et les classes de liaison de données n'ont pas été générées. 

La partie irritante pour moi était que je ne pouvais voir aucun message d'erreur lié à cela, ou que c'était difficile à repérer parmi toutes les autres erreurs de compilation. Et Android Studio ne montre pas non plus l'annotation supplémentaire comme une erreur. Donc, si quelqu'un d'autre a des problèmes avec la même erreur, vérifiez que vous n'avez pas d'erreur dans une annotation empêchant le préprocesseur APT de démarrer. 

4
Johan Paul

J'ai eu cela, plus 29 autres erreurs surgissent soudainement d'un moment à l'autre. J'ai essayé de nettoyer, de reconstruire, d'invalider les caches/redémarrer et pas de chance. En fin de compte, j'ai supprimé les modifications que j'avais apportées et les ai refaites une par une. Constaté que j'avais @Injected un service dans la mauvaise classe. Une fois que j'ai enlevé que toutes les 30 erreurs avaient disparu. Les erreurs ne donnaient aucune idée de ce que j'avais mal fait.

3
tplive

Le simple redémarrage d’Android Studio, sans invalider le cache, a été une bonne solution (j’utilise la version 2.2.3).

3
Honza Kalfus

Si vous utilisez la version Android Studio 2.3 et que la configuration de votre projet est la suivante: 

Gradle version: 3.3
Android plugin version:2.3.0
Compile sdk Version:23+
build tools Version:25+

Tout ce qu'il faut faire, c'est ajouter 

dataBinding{enabled=true}

à build.gradle, puis synchronisez le fichier Gradle.

3
WiselyL

Pour moi, il a été utile d’exécuter ./gradlew clean build dans le dossier du projet. Il a montré une erreur que le studio Android n'a pas.

2
anstue

Vous devez ajouter ceci à votre fichier gradle.properties.

Android.databinding.enableV2=true

De developer.Android.com

plusieurs erreurs peuvent indiquer 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.

1
M'hamed

Si vous utilisez Kotlin, essayez d’appliquer le plug-in suivant à votre fichier app build.gradle:

apply plugin: 'kotlin-kapt'

Nettoyez votre projet et reconstruisez-le. Cela a résolu le problème pour moi.

0
Henrique