数据绑定类未生成


96

我使用的数据在我的项目绑定,使用时<layout><data>在我的XML绑定类不产生。

例如我有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在活动/片段中书写,则会显示错误,表明该类不可用。但是在将其包含<variable>在我的xml文件中之后,它能够生成ActivityMainBinding类。

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


2
dataBinding.enabled在你的build.gradle?
pskink

2
我认为这是一个已知的错误。您可以在尝试访问之前尝试构建项目ActivityMainBinding,或者它必须对此 bug 进行某些处理。
Yennsarah

@pskink是的,这就是为什么它在添加<variable>xml 之后生成绑定类的原因
Ravi

@Amylinn构建它生成的项目后,但是我的问题是当我编写时<variable>,它生成绑定类而不构建项目。
拉维

啊,确实,我错过了
pskink 16/09/14

Answers:


214

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

解决数据绑定问题的提示

更新资料

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

请参阅最新的Android Studio最新的Gradle插件

原始解决方案

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

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

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。但是您应该阅读完整的logcat找到适当的问题

6.从最近关闭并打开项目

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

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

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

7.重建项目

如果仍然没有生成您的类。(有时,当我们粘贴布局文件时,它会发生)。然后从中重建项目Build> Rebuild不是Build或Make project)。它将生成您的数据绑定类。(重建对我来说是魔术。

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

最后的话

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

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

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


2
如果问题仍然存在...(8)无效,然后重新启动....如果未解决,(9)更改dataBinding {enabled = false} ... build,然后再次进行dataBinding {enabled = true}构建...。
PravyNandas


1
就我而言,由于某种原因,IDE无法将其显示为解决方案,因此我必须手动导入类路径。Tnx :)
Ivan Kaloyanov

2
拯救了我的一天。我缺少布局文件中的<layout>包装。谢谢!
朱利诺

您还可以添加“ import android.R”,如果它是导入列表的一部分,则必须将其删除。这解决了我对活动xml文件的未解决引用的问题
蒂姆·约翰

23

DataBinding类自动生成。

如果您的xml名称是activity_test,则Binding类将是ActivityTestBinding。

但,

dataBinding {
        enabled = true
    }

布局应以布局为根

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

我正在搜索灵魂迷几个小时,使gradle魔术很多,但我ConstraintLayout以此为根。谢谢!
阿列克谢·马可夫

14

我遇到过同样的问题。阅读完android sdk文档后,只有要创建的预期文件名,如果没有发生该怎么办没有任何意义。经过更多研究,我注意到将名称空间删除到如下所示的layout元素后(使用您的示例),它对我有用。

    <?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> 

10

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


2
Bingo,为我工作,尽管我必须手动输入导入内容,但是intellisense出于任何原因都没有提供该选项。
罗布

8

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


应该将其标记为正确答案。休息都只是解决方法。无需移动名称空间,甚至无需添加数据元素
Vicky Kapadia

8

如果您做基础工作,则在项目中启用databainding,例如在gradle中使用enable在xml中使用layout标记,当您更改xml代码且未为这些xml生成新的数据绑定类时,可以使用一种快速方式来仅生成数据在绑定类gradle- - >其他> databindinggenbaseclassesDebug其增速超过bulid整个项目。它只生成数据绑定类。 在此处输入图片说明


4
dataBinding {
        enabled = true
    }

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

android.databinding.enableV2=true

3

数据绑定类是在构建期间生成的,因此,在应用程序的Gradle构建中启用数据绑定并在xml周围加上layout标签之后,您应该重新构建应用程序。如果那没有帮助,请删除您的构建文件夹,然后再次进行。


2

多亏了这里的答案 -似乎需要清除“布局名称空间”,或者您需要一个新的唯一名称。

以下是对我有用的选项:

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

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


1

我唯一能想象的就是如果没有

dataBinding {
    enabled true
}

在您的gradle文件中。如果不是,则将其添加到gradle文件中。即

android {
  ......

  dataBinding {
    enabled true
  }
}

然后同步您的项目。如果仍然失败,则可能需要使Android Studio无效/重新启动


我在我的问题中明确提到过,<variable>在xml中添加后,它正在生成Binding类,因此dataBinding,如果我没有添加,那么就不会在不添加gradle文件的情况下生成绑定类。
拉维

同步并重新启动之前。请尝试“制作”。它会锻炼。
Nizamudeen Sherif

1

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

希望对你有效。


1

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

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

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



0

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

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


0

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


0

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

看起来所有字段都必须是文本才能使用,至少与TexView组件一样。

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

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


0

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

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

0

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

未解决的参考:activity_main

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

导入android.R

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


0

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

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

Google经过2天终于找到了解决方案,其中一项对我有效。


1
像资源(.R。)那样绑定资源(.BR )。它是根据您的项目资源(id,drawable,color等)生成的,因此将其放置在您的项目包(your.project.package.BR)中。不在第三方库之内androidx.databinding.library.baseAdapters.BR
dphans

0

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


0

如果要实现Serializable- >,则必须实现Serializable

否则,您将收到此错误。希望以后能对某人有所帮助

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


0

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

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

并使用XML:

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

这将导致上述错误。要解决此问题,您可以将age变量设置为String类型,或者可以在XML中导入String String.valueOf(age)并按以下方式使用:

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

在您的TextView中:

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

0

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

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

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

在遵循KhemrajInvalidate Caches / Restart的响应之后,您应该重写ActivityBinding或FragmentBinding以获取已经生成的类的IDE建议,并且不要对导入进行硬编码。

就我而言,我试图向后导入类的名称be FragmentCompetitionsBinding而不是CompetitionsFragmentBinding

GL

资源


0

就我而言,未生成数据绑定类,因为我已删除了mipmap Android资源目录。我重新创建了res / mipmap /目录,并恢复了数据绑定类。


0

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

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


0

确保启用了数据绑定

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

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


0

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

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


-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.

3
在一般情况下,为什么dataBinding需要Internet许可?
M.Pomeroy

1
@ M.Pomeroy是的,不是必需的,没有编辑答案谢谢
Rohan Lodhi

-5

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


对于gradle 1.5.0及更高版本,不需要使用此类路径。
拉维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.