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

cannot find symbol BR in android data binding

我想使用AndroidData Binding,已经按照官方文档配置好

错误信息是: 错误:找不到符号导入 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>

片段是

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();
    }
}

由于我在Android Studio 中没有出现语法错误,我可以假设Android Studio 可以识别BR class;

但是当我编译项目时,它告诉我 error:cannot find symbol class BR.

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

这是android-apt插件引起的问题。它忽略了数据绑定插件添加的提供的依赖项。

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

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

我也运行关注这个问题。问题是我更改了 class 名称,但没有更新 XML 文件中的值。这包括变量名称以及它们在 xml 文件中的访问位置。

Bindable 注释在编译期间在 BR class 文件中生成一个条目。 BR class 文件将在模块包中生成。

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

万一有人还有这个问题。我通过使 Android Studio 中的缓存无效来解决这个问题。我正在使用 Android Studio 2 和 API 23

File > Invalidate Caches/Restart

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

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

去掉那个问题就解决了。 Android Studio 以某种方式为我错误地解决了 BR class。

我也收到了同样的错误消息,但我的根本原因与此处分享的不同。

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

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

只需重新启动 Android Studio,在不使缓存失效的情况下,我就成功了(我使用的是 2.2.3 版)。

如果你使用AndroidStudio 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个文件。

就我而言,问题是由

引起的

"error: variable MyVariable was already defined in class MyModel"

烦人的是 Android Studio gradle build 没有在底部显示这个错误。我不得不评论每个数据绑定错误 > 重建项目,直到我遇到错误。吸取的教训是从下到上扫描每个错误,并注意您最近可能更改的任何内容。

对我来说,它有助于 运行 ./gradlew clean build 在项目文件夹中。它显示了 android 工作室没有的错误。

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

android.databinding.enableV2=true

来自developer.android.com

you might get multiple errors reporting that the binding classes aren't found. The new data binding compiler prevents these errors by generating the binding classes before the managed compiler builds your app.

我有这个加上 29 个其他错误时不时突然出现。我试过清理、重建、使缓存无效/重新启动,但没有成功。最后我删除了我所做的更改并一项一项地重做。发现我 @Inject 在错误的 class 中输入了一项服务。一旦我删除了所有 30 个错误都消失了。这些错误并没有说明我做错了什么。

如果您使用的是 Kotlin,请尝试将以下插件应用于您的应用 build.gradle 文件:

apply plugin: 'kotlin-kapt'

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

如果您使用的是 Dagger 2,则问题可能是由 Dagger 的组件引起的。尽管两个库不相关,但就我而言,修复编译器中报告的 Dagger 错误会使 BR class 再次正确显示。

BR 在编译期间生成,Build -> Rebuild project 应该可以解决问题。但对我来说它因错误而失败: e:/home/xx/File.kt: (24, 46): Expecting an element 因为在那条线上我有一个未完成的 BR.。只需在 . 之后评论或添加任何内容,然后重建即可解决。

  • 在我的例子中,我没有在其中一个实体上提供 @PrimaryKey 注释,而且很难找到这个错误,因为在日志中没有找到它的线索。所以一定要给你的实体一个主键,否则会出现这个错误。

只需按照以下步骤操作, 1.Extend 你的 class 与 BaseObservable class 2.Add 每个 getter 方法的 @Bindable 注释。 3.Rebuild 项目。 现在您将能够访问 BR

就我而言,我只尝试了 运行 项目并解决了问题。

添加依赖

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

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

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

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

  1. 摇篮文件:

dataBinding {enabled = true}

  1. 您的 class 模特。
 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
     }
 }

检查你的房间数据库相关文件,因为class gradle构建失败,实际上不会得到想法。问题出在 classes 房间。 由于房间数据库 class 有一些语法错误

,你获取这些文件时没有生成什么 androidx.databinding.library.baseAdapters.BR 错误