在android数据绑定中找不到符号BR

在android数据绑定中找不到符号BR,android,data-binding,android-studio,Android,Data Binding,Android Studio,我想使用Android数据绑定,并且已经根据官方文件进行了配置 错误消息是: 错误:找不到符号导入net.juude.droidviews.BR 顶级build.gradle文件是: buildscript { repositories { jcenter() } dependencies { classpath "com.android.tools.build:gradle:1.3.0-beta2" classpath '

我想使用Android数据绑定,并且已经根据官方文件进行了配置

错误消息是: 错误:找不到符号导入net.juude.droidviews.BR

顶级
build.gradle
文件是:

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()
    }
}
应用程序模块中的build.gradle文件为

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'
}
布局文件是

<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>
由于我在androidstudio中没有得到语法错误,我可以假设androidstudio可以识别BR类

但是当我编译这个项目时,它告诉我
错误:找不到符号类BR


所以我想知道我应该怎么做才能让它生成正确的BR.java文件?

这是安卓apt插件造成的问题。它忽略了数据绑定插件添加的所提供的依赖项

您可以通过添加以下内容来解决此问题:
apt'com.android.databinding:compiler:1.0-rc0
到你的gradle文件。

我也遇到了这个问题。问题是我更改了类名,没有更新XML文件中的值。这包括变量名及其在xml文件中的访问位置。

可绑定注释在编译期间在BR类文件中生成一个条目。BR类文件将在模块包中生成

@Bindable
   public String getFirstName() {
       return this.firstName;
   }

以防有人仍然有这个问题。我通过在Android Studio中使缓存失效来解决这个问题。我使用的是带API 23的Android Studio 2


我在我的案例中找到了问题的原因。我发现在我的数据对象类的导入语句中包含:

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

我把它去掉后,问题就解决了。Android Studio以某种方式为我错误地解决了BR类问题。

我也收到了相同的错误消息,但我的根本原因与这里分享的不同

在我的例子中,问题是在解决合并冲突后,我在一个方法上错误地留下了一个额外的
@Override
注释。因此,JVM预处理器失败,然后也没有生成数据绑定类


让我恼火的是,我看不到任何与此相关的错误消息,或者很难在所有其他编译器错误中发现。Android Studio也不会将额外的注释显示为错误。因此,如果其他人遇到同样的错误,请检查注释中是否存在阻止APT预处理器启动的错误

只需重新启动Android Studio,而不使缓存无效,我就成功了(我使用的是2.2.3版)。

如果您使用的是Android Studio 2.3版本,并且您的项目配置如下所示:

Gradle version: 3.3
Android plugin version:2.3.0
Compile sdk Version:23+
build tools Version:25+
所有需要做的就是添加

dataBinding{enabled=true}

到build.gradle,然后同步gradle文件。

对于我的情况,问题是由

“错误:变量MyVariable已在类MyModel中定义”


令人恼火的是Android Studio gradle build没有在底部显示此错误。我必须对每个数据绑定错误>重建项目进行注释,直到出现错误为止。吸取的教训是从下到上扫描每个错误,并注意您最近可能更改的任何内容。

对我来说,在项目文件夹中运行
/gradlew clean build
很有帮助。它显示了一个android studio没有显示的错误。

您需要将此添加到您的gradle.properties文件中

android.databinding.enableV2=true

您可能会收到多个报告未找到绑定类的错误。新的数据绑定编译器通过在托管编译器生成应用程序之前生成绑定类来防止这些错误


我有这个加上其他29个错误突然从一个时刻到下一个。我尝试了清理、重建、使缓存无效/重新启动,但没有成功。最后,我删除了我所做的更改,并一个接一个地重新编辑。发现我在错误的类中插入了服务。有一次我删除了所有30个错误。这些错误没有提示我做错了什么。

如果您正在使用Kotlin,请尝试将以下插件应用到您的应用程序
build.gradle
文件:

应用插件:“kotlin kapt”


清理项目并重新构建它。这为我解决了问题。

如果您使用Dagger 2,问题可能是由Dagger的组件引起的。虽然这两个库不相关,但在我的例子中,修复编译器中报告的Dagger中的错误会使BR类再次正确显示。

BR在编译过程中生成,
Build->Rebuild project
应该可以做到这一点。但对我来说,它失败了,出现了错误:
e:/home/xx/File.kt:(24,46):需要一个元素,因为在那一行我有一个不完整的
BR。
。只需在
之后添加注释或内容,然后重新构建即可解决问题。

  • 在我的例子中,我没有在其中一个实体上提供@PrimaryKey注释,并且很难找到这个错误,因为在日志中没有找到它的线索。因此,请确保为实体提供主键,否则会发生此错误


只需按照以下步骤操作即可, 1.使用BaseObservable类扩展您的类 2.为每个getter方法添加@Bindable注释。 3.重建项目。
现在您可以访问BR

在我的情况下,我尝试运行该项目,它解决了这个问题

添加依赖项

implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"

然后同步项目。即使不起作用,也要使缓存无效并重新启动,然后清理和重建项目。

通常BR在重建项目时自动生成类,我已使用此技术解决了问题,但仍然存在问题,您可以尝试其他解决方案。

您需要仔细检查以下步骤:

  • 渐变文件:
  • 数据绑定{enabled=true}

  • 你的班级模型

    请发布一个SSCCE:@d33tah Soryy,我已经修改了这个问题,也许这样可以。您至少可以在视图->工具窗口->渐变控制台中看到实际的错误。可能会有一个例外,那就是你可以用谷歌搜索。这是不一样的issue@Juude,这是
    implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
    
     import androidx.databinding.BaseObservable
     import androidx.databinding.Bindable
     import androidx.databinding.library.baseAdapters.BR
    
     class User2(
         private var firstName: String,
         private var lastName: String
     ) : BaseObservable() {
    
         fun setFirstName(firstName: String) {
             this.firstName = firstName
             notifyPropertyChanged(BR.firstName)
         }
    
         @Bindable
         fun getFirstName(): String {
             return this.firstName
         }
     }