数据绑定:找不到符号 class BR

Data Binding: Cannot find symbol class BR

我尝试在我现有的项目中使用数据绑定,但我无法构建它。

在项目 build.gradle 中使用:

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.1'
    //Data Binding Beta
    classpath "com.android.databinding:dataBinder:1.0-rc4"

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7+'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

正在申请

apply plugin: 'com.android.databinding'
apply plugin: 'com.neenbedankt.android-apt'`

在模块中:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    apt 'com.android.databinding:compiler:1.0-rc1+'
}

我尝试将数据绑定与 RecyclerView/Fragment/ViewHolder/Adapter.. 我使用 Android Studio 1.4.1。 使用 compileSdkVersion 23 和 buildToolsVersion“23.0.1”。 我在没有 apt 的情况下尝试过,不同的 gradle 版本,证明阅读了我的 classes/xml.. 我还使用 Butterknife(因为我的项目太大,无法一次更改所有内容)和其他(但不相关的)库。 我同步并重建了我的项目,我 closed/opened Android Studio,我试图使缓存无效。我从一开始就构建了一个 'fresh' 示例,效果很好。

我的 getter 我的 "data class" 方法是@Bindable。

此外,未创建数据绑定包。 (错误消息说它不存在)和 Error:cannot generate view binders java.lang.StringIndexOutOfBoundsException: String index out of range: -21

我遇到过与您类似的 DataBinding 问题,例如 Android Studio 无法找到生成的绑定 class,例如 "MainActivityBinding"。重新启动 Android Studio 帮我解决了这个问题。

至于 BR classes,我遇到过找不到它们的问题,但通常是因为我在布局中犯了一个错误-class。例如绑定到一个不存在的字段。确保其他一切正确,然后重新启动 Android Studio。

我几乎每次尝试对自定义对象使用 ObservableList 时都会遇到 Error:cannot generate view binders java.lang.StringIndexOutOfBoundsException: String index out of range: -21 错误。但我发现,几乎每次我在输入后都忘记了 >。傻我。 所以,我的解决方案是检查它:

    <data>

        <import type="android.databinding.ObservableArrayList"/>

        <variable
            name="dices"
            type="ObservableArrayList&lt;Dice>" /> //don't forget the '>' after Dice
    </data>

更新后 Android Studio 到版本 2.3Gradle 3.3 我遇到了这个错误,我的解决方案是将其添加到我的 build.gradle(app) 文件

apt 'com.android.databinding:compiler:2.3.0'

我长期使用数据绑定,我想出了一些要点,对你也有帮助。

此答案将帮助您在 ViewDataBinding class.[=71 中生成 ViewDataBindingBindingResource(BR) class 和布局变量=]

6个避免卡在绑定中的技巧。

(1) 您应该在 build.gradle 启用数据绑定 。如果没有,则添加此和 Sync.

android {
...
   dataBinding {
        enabled = true
    }
...
}

(2) 现在如果你想生成数据绑定 class 那么你应该 用数据绑定包裹 xml layout<layout 标签)。像这样。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

(3) 现在应该生成数据绑定 class。

If your layout name is in snake case activity_main.xml then data binding class will be generated in camel case like ActivityMainBinding.

有时当您键入 ActivityMai... 时,它 不会显示建议 ,但 会不是说 class 是 未生成 。在这种情况下,您应该 键入预期生成的 class 的全名 。就像键入 ActivityMainBinding 一样,它 将显示导入弹出窗口 。 (这就是我多次遇到的问题。)

(4) 如果仍然没有生成你的class。 (有时当我们粘贴布局文件时,它就会发生)。然后 Build> Rebuild 重建项目不是构建或制作项目)。它将生成您的数据绑定 class。 (Rebuild 总是对我有魔力。

(5) 如果您在布局中创建了 <variable 而它 没有在数据绑定 class 中显示其 setter 和 getter,然后 按照第 4 个点 .

(6) 如果您的 class 没有生成,那么您应该 检查构建是否因错误而失败 在你的布局文件中。数据绑定 class 将在构建成功时生成。

这就是我为解决数据绑定错误所做的全部工作。如果您有任何进一步的问题,可以在这里发表评论。

有时 DataBinding 会显示不相关的错误,但在我的情况下我忘了添加 应用插件:'kotlin-kapt' 在您的 Gradle 应用程序文件中

错误实际上可能不是由于数据绑定造成的。 Javac 截断错误日志,因此可能不会显示实际问题。

看看这个 link。 https://movieos.org/2017/android-room-data-binding-compile-time-errors/

对于 AndroidX 项目:

我在迁移到androidx后遇到了这个问题,我就是这样解决的。

  • BR class 是在您重建项目时从数据绑定自动生成的。
  • 但是如果错误依旧,在下面添加代码 你的导入然后重建项目。

    import androidx.databinding.library.baseAdapters.BR;
    

将您的项目转换为 android x,然后从下面的包中导入 BR class 导入 androidx.databinding.library.baseAdapters.BR

在我的例子中,我已经更新了我的代码,这些代码是在更高版本的 Android studio 上构建的。然后我将我的 android 工作室从 3.3.2 升级到 3.5.3 并解决了问题。

我在尝试迁移到 AndroidX 时遇到了这个问题。

初始参数:AStudio 4.0,Gradle插件v4.0.0,Gradlev6.1.1.

我在应用程序中替换了 build.gradle 配置:

dataBinding { enabled = true }

dataBinding.enabled = true

并更新:

黄油刀 9.0.0 => 10.2.1

匕首 2.7 => 2.27(必需)

在我的例子中,我有一些静态导入用于一些后来被删除的变量,并且在项目重新加载android工作室试图导入它们一切顺利分开。

因此,仔细查看项目中的最新更改,尤其是您一定会弄清楚的任何静态导入。

您需要添加插件:

kotlin-kapt

我在我的应用程序中使用 Room,这个问题是由实体主键上缺少 @NonNull 注释引起的。添加注释解决了问题。

我知道这已经晚了,但我希望在经历了一个小时的困惑之后,我可以帮助其他人解决错误。

在我的项目中使用匕首柄复制依赖提供方法时出现此错误,例如:

@Singleton @Binds public abstract ISettingsCacheDataSource provideSettingsCacheDataSource(SettingsCacheDataSourceImpl dataSource);

复制此代码导致此错误出现,删除重复项或使用其他依赖项修复它已为我修复。

可能无法生成 BR 的另一个原因是,您的 Android Gradle 插件早于 4.0.0,并且您没有像这样启用数据绑定:

buildFeatures{
    dataBinding = true
}