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

时间:2015-06-11 09:13:59

标签: 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 '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()
    }
}

并且app模块中的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类;

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

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

22 个答案:

答案 0 :(得分:31)

如果有人仍有这个问题。我通过在Android Studio中使缓存无效来解决这个问题。我正在使用带有API 23的Android Studio 2

File > Invalidate Caches/Restart

答案 1 :(得分:22)

这是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文件。

答案 2 :(得分:7)

我在案件中找到问题的原因。我发现我的Data Object类的import语句包含:

const array = text.split(/\n/);
let box, sliced;
const obj = array.map(line => {
    box = {};
    sliced = line.match(/\[[a-z]+\]/i)[0];
    box.name = sliced.slice(1, sliced.length - 1);
    box.spacing = line.match(/\-+/)[0].length;
    box.type = line.replace(/.*\.com\/([a-z]+)\/.*/, '$1');
    box.id = line.replace(/.*\/([a-z0-9\-]+)\)$/, '$1')
    return box;
});

删除后,问题就解决了。 Android Studio错误地为我解决了BR类。

答案 3 :(得分:6)

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:4)

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

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

令我恼火的部分是我无法看到与此相关的任何错误消息,或者很难发现所有其他编译器错误。并且Android Studio也不会将额外注释显示为错误。因此,如果有其他人在遇到同样的错误,请检查您是否在某些注释中没有出现错误,导致APT预处理器无法启动。

答案 6 :(得分:4)

对于我的情况,问题是由

引起的

&#34;错误:变量MyVariable已在MyModel类中定义&#34;

令人烦恼的是Android Studio gradle build在底部没有显示此错误。我不得不评论每个数据绑定错误&gt;重建项目,直到我发现错误。获得的经验教训是从下到上扫描每个错误,并注意最近可能发生的任何变化。

答案 7 :(得分:3)

我遇到了这个错误,再加上29个其他错误,从一个瞬间到另一个瞬间突然出现。我尝试清理,重建,使缓存无效/重新启动并且没有运气。最后,我删除了所做的更改,并一一重做。发现我在错误的课程中@Inject进行了一项服务。一旦删除,所有30个错误都消失了。这些错误并不表明我做错了什么。

答案 8 :(得分:3)

如果您使用的是Kotlin,请尝试将以下插件应用于您的应用<body> <div id="draw-shapes"></div> <script> ... </script> </body> 文件:

var elem = document.body; ... var two = new Two(params).appendTo(elem);

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

答案 9 :(得分: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文件。

答案 10 :(得分:3)

重新启动Android Studio,而不会使缓存失效,为我做了伎俩(我使用的是2.2.3版本)。

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

android.databinding.enableV2=true

来自developer.android.com

  

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

答案 13 :(得分:2)

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

答案 14 :(得分:2)

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

  1. GradleFile:

dataBinding {enabled = true}

  1. 您的班级模型。
 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
     }
 }

答案 15 :(得分:1)

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

答案 16 :(得分:1)

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

答案 17 :(得分:0)

如果使用Dagger 2,则问题可能是由Dagger的组件引起的。尽管两个库没有关系,但就我而言,修复编译器中报告的Dagger中的错误使BR类再次正确出现。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

就我而言,我尝试仅运行项目,它解决了该问题。

答案 20 :(得分:0)

添加依赖项

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

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

答案 21 :(得分:0)

检查你的房间数据库相关文件,因为那个类gradle构建失败,实际上不会得到想法。问题是在房间类。 由于房间数据库类有一些语法错误,您获取这些文件没有生成androidx.databinding.library.baseAdapters.BR错误