无法解析Android databinding类

63

你的活动名称是什么? - M D
2
清理并构建项目,这将再次生成DataBinding类,就像@RRR所说的那样。 - M D
任何人在面对初始数据绑定设置时,请尝试访问此链接:http://code2concept.blogspot.in/2016/07/android-data-binding-part-1.html - Nitesh Tiwari
2
我注意到如果XML布局文件直接从约束布局开始,它将无法工作。将所有内容包装在<layout>中,将xmlns:android =“...”,xmlns:app =“...”和xmlns:tools =“...”移动到其中,然后进行清理和重建。绑定对象应该出现。另外,正如其他人所说,确保您的命名正确。 - himura
1
可能是[Data Binding class not generated]的重复问题(https://dev59.com/01kS5IYBdhLWcg3ww49d)。 - Khemraj Sharma
显示剩余3条评论
29个回答

108

根据您所遵循的文档,DataBinding类将基于您的xml文件名生成。

默认情况下,将根据布局文件的名称生成绑定类,将其转换为帕斯卡命名法并在其后缀中添加“Binding”。上面的布局文件是main_activity.xml,因此生成的类是MainActivityBinding。

如果您的xml名称为activity_main.xml,则DataBinding类名称将为ActivityMainBinding

如果您的xml名称为main_activity.xml,则DataBinding类名称将为MainActivityBinding

别忘了清理并构建项目一次

您可以关注这个教程了解更多关于DataBinding的信息。


我确认布局名称已经添加在我的问题中。 - pRaNaY
是的,但在问题中您提到了“activity_main.xml”和使用“MainActivityBinding”,应该是“ActivityMainBinding”。 - Rocky
在添加 XML 组件后,请确保重新构建项目,以便生成此类。 - Ajith M A
3
如果您遇到未解决的符号问题,请尝试将您的布局包装在<layout>标签中。 - Nexen
1
每当您使用绑定时,请按照以下步骤操作:1:首先在gradle中执行dataBinding {enabled = true}..同步它..2:如果您有viewmodel,则在<variable>中应用它,使用<layout> <data> </data> </layout>标记3:然后转到您的活动并查看ActivityMainBinding是否存在。如果没有,请重新构建并查看它必须存在。谢谢。 - Vishal
非常感谢。我已经苦恼了一个小时,一直在尝试将 MyActivityBinding 改成 ActivityMyBinding。再次感谢。 - Pooja

27

尝试将xml文件重命名为另一个名称,然后检查绑定是否正常工作,一旦它工作正常,再将其重命名回使用过的名称。

这对于Android Studio 3.1有所帮助。


3
比重新启动 IDE 好。 - Geekarist
1
有趣的是,AS甚至没有重命名xml文件。当我从资源管理器中更改时,绑定类会自动检测到。一个经典的错误!感谢指针。 - NightFury
1
太棒了,你的回答真是太好了。谁能想到重命名会解决问题(嗯...Android Studio!!!)。我一直按照书本上的方法操作,但都不起作用,而这个小技巧却解决了问题。 - Dilip Agheda
这对我有用,但我有很多布局,没有其他解决方案吗?(Android 3.2) - Gilberto Ibarra
@GilbertoIbarra 你可以尝试重新启动 Android Studio 吗? - Ismail Iqbal
Android Studio 3.2.1 仍然存在 Bug。 - Odys

20

感谢大家的回答。我通过 ContentMainBinding 类名找到了数据绑定的解决方案。

注意:使用带有 <include ... 的布局时,如果 <include layout="@layout/content_main" 具有数据绑定功能,则与 include 布局名称相关联的类名为 ContentMainBinding

下面是我的布局文件:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.databindingdemo.app.MainActivity">
    ...
    <include layout="@layout/content_main" />
    ...
    </android.support.design.widget.CoordinatorLayout>

content_main.xml 是我添加了数据绑定布局代码的布局。

因此,可以使用 ContentMainBinding 来替代 MainActivityBinding

下面是对我有效的代码:

//Code for data binding
    ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
    user = new User("Pranay", "Patel", "demoemail@gmail.com", "9999999999");
    contentMainBinding.setUser(user);

DONE.


1
你自己给自己出了个难题,它会将你的活动布局 content_main.xml 与 activity_main.xml 分离开来。你所发现的是将活动附加到布局的默认方式。 - Khemraj Sharma
不要按照这个答案,它会设置布局content_main。如果你想要填充activity_main.xml,那么请将其包装在<layout>标签中,并使用ActivityMainBinding类。 - Khemraj Sharma
感谢@Khemraj的建议。这是一个旧答案,可能存在错误。如果您能更新答案,可以吗? - pRaNaY

17

请确保您的activity_main.xml文件被包围在layout标签中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<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">

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

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

只需在 XML 中任何位置添加 <layout> 标签即可解决此问题。 - Rami Alloush
它真的救了我的一天,我竟然忘记做那件事了。 - Sattar

9

如果DataBinding类名正确,并且您已经清理和重新构建了项目但仍然显示错误。
那么您可以尝试重启AndroidStudio。


8

我已经清理了项目,进行了重建,但是没有用。

然后我使缓存失效并重新启动了项目,但这也没有帮助我。

接着我改变了我的xml文件名 - 这非常好用。

所以,我想分享给你一件事,请更改你的xml文件名。

例如:如果你的xml文件是:activity_main.xml,并且在它的Java类中无法获取ActivityMainBinding..........那么将xml名称更改为main_activity.xml,然后在其Java类中使用MainActivityBinding作为“private MainActivityBinding binding;”

这样做很可能会解决问题。


7

我在更改程序包名称后遇到了同样的问题。尝试了很多方法(包括在此处提到的方法),最终通过手动导入数据绑定类来解决了这个问题:

import com.domain.my.databinding.MyActivityBinding;

7
在这种情况下,如果重建或使缓存无效都不起作用,那么你的某个xml文件中必须存在错误,你可能使用了@{xyz.abc},并且xml中的xyz或abc存在问题。

6
在我的情况下,删除应用程序构建文件夹,然后重新构建项目解决了我的问题。即使按照以下步骤也无效。
          1) Rebuild the project after adding the dataBinding  in gradle.

          2) Rebuild after adding layout tag in xml.

          3) cleaning the project

          4) rebuilding the project

          5) Restarted the Android Studio

在应用的gradle文件中启用dataBinding后,请重新构建。然后我们可以找到生成的Binding类。
          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.

我也尝试过在重新启动AS后将绑定生成类型从AS内置更改为编译器,反之亦然。但是没有任何变化。昨天一切都正常工作。 - IC_
我浪费了一个小时来解决这个问题,然后我尝试了你的解决方案,我改变了XML的名称,但它仍然不起作用,然后我重新构建、清理并重启,现在它可以工作了。谢谢。 - Rucha Bhatt Joshi

5
请确保在build.gradle文件中添加以下行:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接