未生成数据绑定 class

Data Binding class not generated

我在我的项目中使用数据绑定,当在我的 xml 绑定中使用 <layout><data> 时,未生成 class。

例如我有 activity_main.xml

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

现在,如果我在 activity/fragment 中写入 ActivityMainBinding,它会显示 class 不可用的错误。但是在我的 xml 文件中包含 <variable> 之后,它能够生成 ActivityMainBinding class.

Android工作室:2.1.3
类路径:com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

使用class路径'com.android.databinding:dataBinder:1.0-rc0'

如果可能的话,我唯一能想象的就是如果你没有

dataBinding {
    enabled true
}

在您的 gradle 文件中。如果不只是将它添加到 gradle 文件中。 即

android {
  ......

  dataBinding {
    enabled true
  }
}

然后同步您的项目。如果仍然失败,您可能需要 Invalidate/Restart 您的 android 工作室

我遇到了同样的问题。阅读 android sdk 文档后,只有预期的文件名要创建,但没有关于如果没有发生该怎么做的内容。经过更多研究后,我注意到在将命名空间移除到布局元素后(使用您的示例),它对我有用。

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

DataBinding class 自动生成。

如果您的 xml 名称是 activity_test 那么绑定 class 将是 ActivityTestBinding.

但是,

dataBinding {
        enabled = true
    }

layout 应该有 layout 作为 root

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

正确设置后(包括 xml 命名空间并将所有内容包装到 <layout> 中),对我有用的是构建 -> Make 项目。 Clean Project 或 Rebuild Project 也没有。我在 Android Studio 2.3.1,使用 26.0.2 构建工具。不需要 <data> 标签。

数据绑定 类 是在构建过程中生成的,因此在您在应用的 Gradle 构建中启用数据绑定并用布局标签围绕您的 xml 之后,您应该重建您的应用程序。如果这没有帮助,请删除您的构建文件夹并重新执行。

我遇到了同样的问题。你所做的一切都是正确的。问题是您需要在 xml 中的数据标记内添加变量。为此,您应该创建一个示例模型 class 并将其作为变量添加到数据标签中。

在此之前,您将看不到生成的 ActivityMainBinding。

在我的例子中,绑定 class 已生成并就位(但我认为不是)......但它不会自动将所述 class 的导入添加到 activity/fragment 导入部分... 所以... OPTION + ENTER :)

我没有得到任何满意的答案。所以这里有一些技巧,是我对数据绑定知识的总结。

解决数据绑定问题的技巧

更新

为了获得更准确的错误建议,我强烈建议更新Android Studio 和Gradle插件版本为最新。因为我在 AS 3.2 版本之后没有遇到很多问题。

参见 Latest Android Studio, and Latest Gradle Plugin

原解

After reading this answer, you will not get stuck in data binding auto generation issues for both Classes and Data Variables.

这些要点一一检查。这些中的任何一个都可以使您完成工作。 最后的第 3 点非常重要,所以不要错过。

1。检查是否启用了数据绑定

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

android {
    ...
    buildFeatures {
        dataBinding 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>

同时检查绑定变量名称是否与视图模型中一样正确class

3。自动生成的绑定 class name?

您的数据绑定 class 应该在创建绑定布局后生成。

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

4。看不到导入建议?

有时当您键入 ActivityMai... 时,它 不会显示建议 ,在这种情况下 手动导入.

import <yourpackage>databinding.ActivityMainBinding;

5。读取构建失败 Logcat

如果构建失败,您的绑定 class 和布局中的新变量将不会生成。所以首先 Make project by Ctrl + F9 (Build > Make project).

  • 如果构建失败然后查看错误是什么,通常我们在布局字段中有错误。错误日志会指出问题所在的错误行号。
  • 绑定可能失败导致一些愚蠢的错误,例如语法错误或缺少导入。在这种情况下,您将得到 logcat 充满绑定错误 class 的错误。但是您应该阅读完整的logcat找到合适的问题

6。关闭并打开最近的项目

我总是这样做,因为它比 Rebuild / Make 项目花费的时间少得多。

  • 从文件 > 关闭项目关闭项目
  • 从最近重新打开

请注意我更喜欢最近关闭和打开因为它花费的时间少得多比 重建/重启 IDE.

7。重建项目

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

8。拥有最新的 Android Studio

将 AS 更新为 Android Studio 3.2 后,我感觉在数据绑定自动生成中修复了很多错误。所以你也应该有最新的AS。

#<variables

的解决方案
<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

通常,当我们在布局中放置一个变量时,它会创建它的 getter 和 setter。我们可以使用 binding.setItem(item);binding.getItem();,但如果您看不到这些方法,请阅读以下信息。

1。关闭并打开最近的项目

如果您在布局中创建了一个数据变量 - <variable,并且它 没有显示其 setter 和 getter 在数据绑定 class 中,然后 关闭并从最近 您的项目打开。

2。更改类型后清理项目

如果您在布局中更改了某些 <variable 的类型并且 getter setter 类型未更改,则 清理项目(Build> Clean Project)

最后的话

最后,如果您的绑定 class 仍然没有生成,那么我们就有了我们最强大的武器。 - 重新启动 Android Studio

  • 首先,尝试重启,这总是在重启后生成我的绑定布局的变量。
  • 如果它不起作用,则 使缓存无效并重新启动

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

1.Add 应用下方 gradle

 dataBinding {
        enabled = true
    }

2.In xml 布局写在代码下面

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

我不知道它是否适合你。只需 重命名 布局 XML 文件名。假设您的布局名称是 activity_main.xml 只需将其重命名为 main.xml 之类的名称,然后再次将其重命名为 activity_main.xml。然后您可以在 ActivityMainBinding.

上看到导入选项

希望对你有用。

dataBinding {
        enabled = true
    }

要启用新的数据绑定编译器,请将以下选项添加到您的 gradle.properties 文件中:

android.databinding.enableV2=true

更新:

要启用数据绑定,请使用,

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

请关注此link: https://developer.android.com/jetpack/androidx/releases/databinding

当您使用 多模块 Android 应用程序时 检查您的绑定 class 路径。也许你应该使用:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding 代替:

import com.yourcompany.app.android.databinding.FragmentABCtBinding

如果你做基础工作,为了在你的项目中启用数据绑定,比如在 gradle 中使用 enable 并在 [=24] 中使用 layout 标签=],当您更改 xml 代码并且没有为那些 xml 生成新的数据绑定 class 时,您可以使用一种仅生成数据绑定的快速方法 class 在 gradle->other->databindinggenbaseclassesDebug 它比构建整个项目快得多。它只生成数据绑定 class。

感谢 - "layout namespace" 似乎需要清除,或者您需要一个新的唯一名称。

以下是对我有用的选项:

  1. 为布局创建一个新名称以确保它可以生成。这解决了我的问题,我的布局是 首次创建的,没有数据绑定 - 让我们称之为 fragment_abc.xml。当我尝试向其添加数据绑定时,它无法识别 - 即使在多次清除缓存和重新启动调用之后也是如此。但是,一旦我复制了布局 fragment_abc2.xml,我立即得到了生成的数据绑定 .java/.class 对象。

  2. 看到上面的工作后,我尝试只从模块中删除 /build 文件夹,然后重新构建项目 - 这可以为原始布局获取数据绑定。

我遇到了类似的问题,我在 gradle 文件中包装了布局并启用了数据绑定。主要 activity 仍然无法智能感知或查看我的 classes。为我修复的是添加绑定变量并导入绑定。从那里我刚刚构建了解决方案,然后它似乎知道 class 是什么。从那里我可以导入我生成的驼峰案例 classes。

我遇到了问题,问题出在布局中,使用的字段不是字符串,而是日期。

看起来所有字段都必须是文本才能工作,至少对于 TexView 组件。

如果你用命令构建 ./gradlew build --stacktrace

这样可以更好地显示错误。

在我的例子中,我认为生成的 class 必须与我通常的 classes 一起出现在 src 文件夹中。另外,我认为生成的 class 的名称应该略有不同。都是我的错。生成的 class 可以在 build 文件夹,build -> generated -> ... 路径中找到。如果您的 activity 中没有导入生成的 class,请添加导入

import com.yourcompany.app.databinding.ActivityMainBinding;"

删除布局并撤消,并确保生成的绑定 类 之后正确导入。

如果最近有人将现有项目迁移到 androidx,那么您需要从

替换导入
import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

经过 Google 2 天终于得到解决方案,其中一个对我有用。

万一在DataBindingUtil.setContentView

中出现以下错误

Unresolved reference: activity_main

您只需删除以下导入语句

import android.R

我在另一个论坛上找到了解决方案。 Source

有些情况下您在生成的目录下看不到文件,您可能绑定了一个未在视图模型中声明的 属性。如果你在 xml.

中这样做,它基本上不会给你一个 lint 错误

如果您要实现 Serializable -> 您必须实现 Serializable

否则你会得到这个错误。希望它能对以后的人有所帮助

在我的例子中,我使用了 Parcel 库。我错过了在我的子 class

中注释 @Parcel

除了上述步骤,您还可以检查变量类型。确保它是 TextView 的字符串或与 BindingAdapter 中定义的相同。 例如:

data class MyDataObject(val name: String, val age: Int)

并在 XML 中:

android:text="@{dataobject.age}"

这样就会出现上面的错误。要解决此问题,您可以创建 String 类型的 age 变量,也可以在 XML 中导入 String 并使用 String.valueOf(age),如下所示:

<data>
    <import type="String" />
...
</data>

在您的 TextView 中:

android:text="@{String.valueOf(dataobject.age)}"

如果您的 XML 文件有问题,数据绑定 class 将不会 生成。快速修复是通过 XML 文件到 运行 并检查语法错误(通常以红色突出显示)。错误可能以不存在或错误的引用、印刷错误等形式出现。

本质上,只要确保您的 XML 代码中没有红色下划线即可。完成后,重建并生成数据绑定 class。

我的解决方案是在 class 名称中使用 FragmentBinding 作为后缀。

A binding class is generated for each layout file. By default, the name of the class is based on the name of the layout file, converting it to Pascal case and adding the Binding suffix to it. The above layout filename is activity_main.xml so the corresponding generated class is ActivityMainBinding. This class holds all the bindings from the layout properties (for example, the user variable) to the layout's views and knows how to assign values for the binding expressions.

activity 或片段 class 的命名法可能在前缀方面有所不同。因为后缀总是Binding。

遵循Invalidate Caches / Restart的响应后,您应该重写ActivityBinding或FragmentBinding以获得IDE 已生成 classes 的建议,请勿硬编码导入。

在我的例子中,我试图将 class 的名称向后导入 FragmentCompetitionsBinding 而不是 CompetitionsFragmentBinding

GL

Source

在我的例子中,没有生成数据绑定 类,因为我删除了 mipmap Android 资源目录。我重新创建了 res/mipmap/ 目录并恢复了数据绑定 类。

我遇到了类似的问题,其中 DataBinding 无法生成 BindingImpl class。 在我的例子中,数据 class 中的方法出现了问题,其中名称使用错误: 该模型包含一个方法 onSignInCliked(),在布局中我使用了 onSigninCliked()。请注意 SignInSignin.

错误消息还不够,我只有在使用带有堆栈跟踪选项的构建脚本时才发现问题。

确保启用数据绑定

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

但单击按钮(与 Gradle 同步项目)

如果不适合你,那么我的建议很简单但有效。

我们的想法是确定产生问题的组件。为此,请在 CustomFragment.kt 中评论 custom_fragment.xmlits uses 的所有行,并留下像下面这样的极简主义内容。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</layout>

然后 运行 应用程序并添加组件到组件,同时 Apply Code Changes (Ctrl+Alt+F10) 执行应用程序,直到应用程序崩溃,这就是你发现错误的时候.

数据绑定日志有时描述性不强,这是查找故障组件的通用策略。

GL

我已经生成了所有 类,但 Android Studio 没有看到它们并将它们标记为无效导入。 运行 gradle 同步解决了问题。

我遇到了同样的问题。我在重构时犯了一个错误。 autogen 绑定 class 的名称来自 xml 布局文件。

fragment_name.xml -> FragmentNameBinding

检查接受答案中的所有原因后,确保与 file.xml 中的确切命名相匹配。就我而言,我的布局名称中有一个小错字。