未生成数据绑定类

我正在我的项目中使用数据绑定,当在我的 xml 绑定类中使用 <layout><data>时没有生成。

例如,我有 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>

现在,如果我正在活动/片段中编写 ActivityMainBinding,它会显示类不可用的错误。但是在我的 xml 文件中包含了 <variable>之后,它就能够生成 ActivityMainBinding类了。

Android Studio: 2.1.3
类路径: < strong > com.android.tools.build: gradle: 2.1.3
MinSdkVersion < strong > 16
TargetSdkVersion < strong > 24
BuildToolsVersion < strong > 24.0.0

106435 次浏览

使用类路径‘ com.android.dataBinder: 1.0-rc0’

如果可能的话,我唯一能想到的就是

dataBinding {
enabled true
}

如果不是直接加到你的档案里。 也就是说

android {
......


dataBinding {
enabled true
}
}

然后同步你的项目。如果它仍然失败,你可能需要做无效/重新启动你的 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 类。

如果 xml 名称为 activity _ test,那么 Binding 类将为 ActivityTestBinding

但是,

dataBinding {
enabled = true
}

布局应该以布局为根

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

在正确地设置了它(包括 xml 名称空间并将所有内容包装到 <layout>中)之后,对我有效的方法是执行 Build-> Make 项目。清洁项目或重建项目也没有。我在 Android Studio 2.3.1中,使用的是26.0.2构建工具。不需要 <data>标签。

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

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

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

在我的例子中,Binding 类已经生成并就位(但我认为它不是) ... ... 但是它不会自动将所述类的导入添加到活动/片段导入部分... ... 所以... ... OPTION + ENTER:)

我没有得到任何令人满意的答案。所以这里是我的数据绑定知识的总结提示。

解决数据绑定问题的提示

更新

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

参见 最新 Android Studio最新的 Gradle 插件

原创解决方案

读完这个答案后,您在 不会被卡住中的数据绑定自动生成问题 类和数据变量

逐个检查这些点。任何一个都可以使你的工作完成

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

你应该有 启用数据绑定build.gradle。如果没有,然后添加这个和 同步

android {
...
buildFeatures {
dataBinding true
}
}

2. 检查布局转换为绑定布局

现在,如果您想要生成数据绑定类,那么您应该使用 用数据绑定包装 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>

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

自动生成的绑定类名?

应该在创建绑定布局之后生成数据绑定类。

如果您的布局名称在 蛇皮箱activity_main.xml中,那么数据绑定类 会像 ActivityMainBinding一样在 骆驼皮箱中产生。

看不到进口建议?

有时当你输入 ActivityMai...,然后它 没有暗示,在这种情况下 手动导入

import <yourpackage>databinding.ActivityMainBinding;

5. 阅读 Build Fail Logcat

如果构建失败,将不会生成布局中的绑定类和新变量。所以第一个 制定计划Ctrl + F9(Build > Make project)

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

从最近开始关闭和打开项目

我总是这样做,因为它需要更少的时间比 Rebuild/Make项目。

  • 从文件中关闭项目 > 关闭项目
  • 从最近再次打开

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

7. 重建项目

如果仍然没有生成类。(有时当我们粘贴布局文件,然后它发生)。然后 重建计划Build> Rebuild(不生成或制作项目)。它将生成您的数据绑定类。(重建为我带来魔力。)

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,那么 从最近关闭和打开就是您的项目。

2. 更改类型后清理项目

如果你在你的布局中改变了一些 <variable的类型,而 getter setter 的类型没有改变,那么 清洁工程(Build> Clean Project)

临终遗言

最后,如果仍然没有生成绑定类,那么我们就拥有了最强大的武器

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

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

1. 在应用程序级别中添加以下内容

 dataBinding {
enabled = true
}

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一样,只要将它重命名为任何类似于 Xml的名字,然后再次将它重命名为 Activity _ main. xml。然后您就可以在 ActivityMainBinding上看到导入选项。

希望对你有用。

dataBinding {
enabled = true
}

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

android.databinding.enableV2=true

更新:

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

android {
...
buildFeatures {
dataBinding true
}
}

请按以下连结: Https://developer.android.com/jetpack/androidx/releases/databinding

使用 多模块 Android 应用程序时,请检查绑定类的路径。也许您应该使用:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding 而不是:

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

如果你做基础工作,为了在你的项目中启用数据绑定,比如使用 在坡度上使能Xml 中的布局标记,当你更改 xml 代码并且没有为那些 xml 生成新的数据绑定类时,你可以使用一种快速的方法在 Gradle-> other-> database indinggenbaseclassesDebug中只生成数据绑定类,它比构建整个项目更快。它只生成数据绑定类。 enter image description here

感谢 这个答案-它看起来像 “布局命名空间”需要被清除,或者你需要一个新的独特的名称。

以下是对我有效的选择:

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

  2. 在看到上面的工作之后,我尝试从模块中删除/build 文件夹,并重建项目——这样可以为原始布局获得数据绑定。

我有一个类似的问题,我有布局封装和我的数据绑定在 gradle 文件启用。主要活动仍然无法感知或看到我的课程。对我来说,修复它的方法是添加绑定变量并导入绑定。从那里我只是构建了解决方案,然后它似乎知道类是什么。从那里,我能够导入生成的驼峰大小写类。

我得到的问题和问题是在布局字段使用的不是一个字符串,它是一个日期。

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

如果使用以下命令生成 ./gradlew build —— stacktrace

这更好地显示了错误。

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

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

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

如果最近有任何一个迁移到 安卓现有的项目,那么您需要替换您的导入从

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

经过谷歌2天终于得到解决方案,哪一个为我工作。

以防在 DataBindingUtil.setContentView 中出现以下错误

未解析的引用: activity _ main

您所需要做的就是删除以下 import 语句

进口机器人 R

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

在某些情况下,您不会在生成的目录下看到一个文件,您可能正在绑定一个在 viewmodel 中没有声明的属性。如果您在 xml 中这样做,它实际上不会给您一个 lint 错误。

如果实现了 可序列化-> ,则必须实现 可序列化

否则你会得到这个错误。希望将来能帮到别人

在我的例子中,我使用了 Parcel 库

除了上述步骤之外,还可以检查变量类型。确保它是 String for 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>

在你的文本视图中:

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

如果您的 XML 文件有问题,将生成 Databinding 类 不会。一个快速修复方法是运行 XML 文件并检查语法错误(通常用红色突出显示)。错误可能以不存在或错误引用、排印错误等形式出现。

实际上,只要确保 XML 代码中没有带红色下划线的行即可。完成后,将生成重新生成并生成 Databinding 类。

我的解决方案是在类名中使用一个后缀 FragmentBinding。

为每个布局文件生成一个绑定类。默认情况下,类的名称基于布局文件的名称,将其转换为 Pascal case 并向其添加 Binding 后缀。上面的布局文件名是 activity _ main.xml,因此相应生成的类是 ActivityMainBinding。此类保存从布局属性(例如,用户变量)到布局视图的所有绑定,并知道如何为绑定表达式分配值。

活动或片段类的名称术语可能因前缀而有所不同。因为后缀始终是 Binding。

在跟踪 Khemraj无效缓存/重新启动的响应之后,你应该重写 ActivityBinding 或者 FragmentBinding获得已经生成的类的 IDE 建议,并且不要硬编码导入。

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

GL

来源

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

我遇到过类似的问题,DataBinding 未能生成 BindingImpl类。 在我的例子中,数据类中的一个方法使用错误的名称是一个问题: 模型包含一个方法 OnSignInClike (),在布局中我使用了 OnSigninClike ()

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

确保启用了数据绑定

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

Sync project with gradle Dan 点击按钮(同步项目与分级)

如果 回答不适合你,那么我的建议是简单而有效的。

这个想法是为了确定哪个组件产生了问题。要做到这一点,评论的所有线路,您的 custom_fragment.xml它的用途CustomFragment.kt中,并留下一些像下面这样的极简主义。

<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 没有看到它们,并将它们标记为无效导入。运行梯级同步解决了这个问题。

Android Studio - gradle sync

我也有同样的问题,我在重构时犯了一个错误。 Autogen 绑定类的名称来自 xml 布局文件。

片段 _ name.xml-> FragmentNameBinding

在检查接受的答案中的所有原因之后,确保与 file.xml 中的确切命名相匹配。在我的情况下,我在我的布局名称有一个小的打字错误。

大部分时间只是需要重建。不建不做项目。如果你首先做无效的缓存并重新启动 Android 工作室,然后清理并重新构建它,那么效果会更好。