未生成数据绑定类

时间:2016-09-14 05:33:12

标签: android data-binding android-databinding

我在项目中使用数据绑定时,在我的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>

现在,如果我在我的activity / fragment中编写ActivityMainBinding,则会显示该类不可用的错误。但是在我的xml文件中包含<variable>之后,它就可以生成ActivityMainBinding类。

Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

31 个答案:

答案 0 :(得分:86)

我没有得到令人满意的答复。因此,这里有一些技巧,这些技巧是我的数据绑定知识的总结。

解决数据绑定问题的提示

更新

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

请参见Latest Android StudioLatest Gradle Plugin

原始解决方案

  

阅读此答案后,您不会陷入类和数据变量的数据绑定自动生成问题。

一一检查这些点。这些都可以使您的工作完成。 最后的第三点非常重要,请不要错过它们。

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

您应该在build.gradle中启用数据绑定。如果没有,则添加它并同步

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

3。自动生成的绑定类名称?

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

  

如果您的布局名称为蛇形 activity_main.xml,则为数据绑定类   将以驼峰式形式生成,例如ActivityMainBinding

4。看不到导入建议?

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

    import <yourpackage>databinding.ActivityMainBinding;

5。阅读Build Fail Logcat

如果构建失败,则不会生成布局中的绑定类和新变量。因此,首先通过 Ctrl + F9(生成>创建项目) 创建项目

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

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

我总是这样做,因为它比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 ,则< strong>关闭并从最近打开您的项目。

2。更改类型后清理项目

如果您在布局中更改了某些 <variable 的类型,并且getter setter类型没有更改,则 Clean project(Build> Clean Project

最后一句话

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

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

这就是我为解决我的数据绑定错误所做的一切。如果您还有其他问题,可以在这里发表评论。

答案 1 :(得分:20)

自动生成DataBinding类。

如果你的xml名称是activity_test,那么Binding类将是ActivityTestBinding。

但是,

for(int arrElm : tempArray){
        tail += Math.abs(arrElm);
    }

布局应该以root身份布局

dataBinding {
        enabled = true
    }

答案 2 :(得分:10)

我有同样的问题。在阅读了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> 

答案 3 :(得分:8)

正确设置它(包括xml命名空间并将所有内容包装到<layout>)之后,对我有用的那个就是做Build - &gt;制作项目。 Nor Clean Project或Rebuild Project也做到了。我在Android Studio 2.3.1中,使用26.0.2构建工具。不需要<data>标记。

答案 4 :(得分:8)

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

答案 5 :(得分:5)

如果您做基础工作,则可以在项目中启用数据绑定,例如在更改xml代码但未更改时,使用在gradle中启用并在xml中使用 layout标签为这些xml生成新的数据绑定类,您可以使用一种快速的方法在 gradle-> other-> databindinggenbaseclassesDebug 中仅生成数据绑定类,这比建立整个项目要快得多。它只生成数据绑定类。 enter image description here

答案 6 :(得分:2)

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

答案 7 :(得分:2)

dataBinding {
        enabled = true
    }

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

android.databinding.enableV2=true

答案 8 :(得分:1)

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

dataBinding {
    enabled true
}
你的gradle文件中的

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

android {
  ......

  dataBinding {
    enabled true
  }
}
然后

同步您的项目。如果它仍然失败,您可能需要对Android工作室进行无效/重启

答案 9 :(得分:1)

感谢this answer here-似乎需要清除“布局名称空间” ,或者您需要一个新的唯一名称。

以下是对我有用的选项:

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

  2. 看到上述工作之后,我试图从模块中删除/ build文件夹,然后重新构建项目-这样做是为了获得原始布局的数据绑定。

答案 10 :(得分:1)

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

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding 插入:

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

答案 11 :(得分:1)

如果最近有人将现有项目迁移到 androidx ,那么您需要替换导入的内容

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

Google终于有2天的解决方案了,哪一个对我有用。

答案 12 :(得分:1)

如果answer对您不起作用,那么我的建议很简单但有效。

这个想法是要确定是哪个组件导致了问题。为此,请在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

答案 13 :(得分:0)

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

Android Studio - gradle sync

答案 14 :(得分:0)

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

否则,您将收到此错误。希望将来对某人有帮助

就我而言,我使用的是Parcel库。我错过了在子类中对@Parcel进行注释

答案 15 :(得分:0)

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

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

和XML:

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

这将导致上述错误。要解决此问题,您可以将age变量设置为String类型,也可以将String导入XML并使用String.valueOf(age),如下所示:

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

在您的TextView中:

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

答案 16 :(得分:0)

如果您的XML文件有问题,将不会生成数据绑定类 。一个快速解决方案是遍历XML文件并检查语法错误(通常以红色突出显示)。错误可能以不存在或错误的引用,印刷错误等形式出现。

本质上,只需确保XML代码中没有红色下划线的行即可。完成后,将重新生成您的Databinding类。

我希望这会有所帮助。快活的编码!

答案 17 :(得分:0)

我的解决方案是在类名中将FragmentBinding作为后缀。

  

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

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

在遵循Khemraj使缓存无效/重新启动的响应之后,您应该重写ActivityBinding或FragmentBinding 以获取有关已经存在的类的IDE建议。生成并且请勿对导入进行硬编码。

在我的情况下,我试图将类名倒退为FragmentCompetitionsBinding而不是CompetitionsFragmentBinding

GL

Source

答案 18 :(得分:0)

在我的情况下,未生成数据绑定类,因为我已经删除了mipmap Android资源目录。我重新创建了res / mipmap /目录,并恢复了数据绑定类。

答案 19 :(得分:0)

我遇到了类似的问题,即DataBinding无法生成 BindingImpl 类。 在我的情况下,是数据类中的方法使用了一个名称错误的问题: 该模型包含方法 onSignInCliked(),在布局中,我使用了 onSigninCliked()。请注意登录登录

错误消息还不够,仅当我将构建脚本与stack-trace选项一起使用时,我才发现问题。

答案 20 :(得分:0)

确保已启用数据绑定

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

Sync project with gradle 单击按钮(使用Gradle同步项目)

答案 21 :(得分:0)

在某些情况下,您不会在生成的目录下看到文件,则可能是绑定了未在viewmodel中声明的属性。如果您在xml中这样做,从本质上讲不会给您带来皮棉错误。

答案 22 :(得分:0)

如果在DataBindingUtil.setContentView中出现以下错误

  

未解决的参考:activity_main

您需要做的就是删除以下导入语句

  

导入android.R

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

就我而言,我认为生成的类必须与我的常规类一起出现在src文件夹中。另外,我认为生成的类的名称应该稍有不同。都是我的错可以在build文件夹的build -> generated -> ...路径中找到生成的类。如果您的活动中没有导入的生成类,请添加导入

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

答案 25 :(得分:0)

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

至少在TexView组件上,所有字段都必须是文本才能使用。

如果使用命令进行构建 ./gradlew构建--stacktrace

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

答案 26 :(得分:0)

我遇到了类似的问题,其中包装了布局,并在gradle文件中启用了数据绑定。主要活动仍无法理解或查看我的课程。对我来说固定的是添加绑定变量并导入绑定。从那里我刚刚构建了解决方案,然后它似乎知道了什么是类。从那里,我能够导入生成的骆驼案例类。

答案 27 :(得分:0)

我不知道它是否对您有用。只需重命名布局XML文件名。就像假设您的布局名称为 activity_main.xml 一样,只需将其重命名为 main.xml 之类,然后再次将其重命名为 activity_main.xml 。然后,您可以在 ActivityMainBinding 上看到导入选项。

希望它对您有用。

答案 28 :(得分:0)

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

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

答案 29 :(得分:-1)

1。在应用gradle中添加以下内容

 dataBinding {
        enabled = true
    }

2。在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.

答案 30 :(得分:-4)

使用类路径&#39; com.android.databinding:dataBinder:1.0-rc0&#39;