Android - DataBinding - 如何以及何时生成绑定类?

时间:2015-07-12 07:59:22

标签: android data-binding

DataBinding Guide个州

  By default, a Binding class will be generated based on the name of the layout 
file, converting it to Pascal case and suffixing “Binding” to it. 
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.

什么时候会生成Binding类,比如说ActivityMainBinding。我有编译时错误。 “无法解析ActivityMainBinding”。

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);

感谢任何帮助。谢谢

19 个答案:

答案 0 :(得分:85)

你的布局名称是什么?

  

上面的布局文件是activity_main.xml,因此生成类是ActivityMainBinding。

这意味着生成的类名将取决于您的布局的名称

activity_main.xml - > ActivityMainBinding.java

我认为您的活动名称是" main_activity",因此生成的绑定类名称应该是MainActivityBinding而不是ActivityMainBinding

答案 1 :(得分:35)

当它没有生成绑定类时,我重新启动Android studio。然后将生成绑定类。是不是由android studio的缓存引起的?

顺便说一句,如果你使用的是android-apt,请检查一下。因为它会导致不生成绑定类。

答案 2 :(得分:27)

您是否更新了数据绑定的布局文件?它们仅针对具有数据绑定的布局生成。

必须以layout标记开头,该标记包含2个子标记(数据和您的根视图)。

这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout ...
   </LinearLayout>
</layout>

当您的布局具有此表单时,AndroidStudio应自动完成该类。此外,默认情况下,它是在<your.app.package>.databinding包中生成的。

答案 3 :(得分:14)

尝试将布局重命名为main_activity.xml

就我而言,它并没有为&#34; activity_main.xml&#34;生成绑定类。 但是将布局文件重命名为main_activity.xml就可以了。

答案 4 :(得分:9)

规则

布局名称位于 snake_case 中,并且生成的绑定类名称将为 CamelCase

  

如果布局名称为activity_home.xml,则绑定类名称将为   是ActivityHomeBinding.class

问题

  1. 很多时候您没有获得DataBinding类的导入建议。
  2. 当布局存在问题时,不会生成绑定类。
  3. 构建失败时,绑定类不可用

这是黑客

未收到导入建议时

  • 未收到导入建议时。像这样手动导入您的绑定类。 (IDE通常不显示有关绑定类的建议)

    import <yourpackage>databinding.ActivityMainBinding;
    

导入行仍然显示错误?

  • 如果您的导入行显示错误,请尝试制作项目(Ctrl + F9)/ Build>制作项目。 。
    1. 如果由于某些错误导致构建失败,请解决该问题。
    2. 如果构建成功,则将生成绑定类。

用于生成绑定类的快速技巧-

  • 如果未生成绑定类,请关闭项目(“文件”>“关闭项目”),然后从最近打开

请注意,我建议从最近开始关闭并打开,因为它花费的时间比重建 / >重新启动IDE 。

在绑定类中生成布局变量的快速技巧-

  • 如果未生成布局数据变量,则关闭项目(“文件”>“关闭项目”),然后从最近打开

如果仍有问题。在评论中让我知道,或进一步了解this answer

答案 5 :(得分:4)

确保:

的布局
 <data>
   <variable name="user" type="com.example.User"/>
 </data>

如果您正在寻找ActivityMainBinding,请在 activity_main.xml 中。在大多数样板项目中,您将内容视图设置为activity_main.xml,但随后会为您的fragment_main.xml充气。

如果您将<data>置于 fragment_main.xml 布局中,则生成的类将为 FragmentMainBinding

注意:阅读后这看起来很明显,但是在关注android文档时很容易被忽略。

答案 6 :(得分:4)

如果您想提供自己的Binding类名,只需将class属性添加到具有类名的data元素

  

通过调整数据元素的class属性,可以重命名绑定类或将绑定类放在不同的包中。

<data class="ContactItem">
    ...
</data>

<data class="com.example.ContactItem">
...
</data>

答案 7 :(得分:4)

在我的情况下,重启Android Studio确实有效。这是android-apt

中的错误

答案 8 :(得分:1)

为了使android数据绑定正常工作,你必须使用android工具进行gradle(com.android.tools.build:gradle)&gt; = 1.3.0。

所以你的项目build.gradle必须如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath "com.android.databinding:dataBinder:1.0-rc1"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

模块build.gradle必须有这个插件:

apply plugin: 'com.android.databinding'

毕竟,检查你的模块,你正在使用最新的buildToolsVersion(现在它是22.0.1)。我不确定是否需要,但它可能会让你感觉良好,因为你处于“技术的最前沿”^ _ ^:

buildToolsVersion '22.0.1'

重新同步gradle和重建项目。如果不重建项目,可能无法生成SomeLayoutBinding个类。

在Android Studio中,可以从应用程序菜单中完成:Build -> Rebuild project

答案 9 :(得分:1)

面临同样的问题。

原因&#34;无法解决ActivityMainBinding&#34;是你的Binding文件没有生成。尝试清理和重建项目。 还要确保您已按照以下步骤操作:

  1. classpath&#34; com.android.databinding:dataBinder:1.0-rc4&#34; - &gt;在主模块构建文件
  2. 中包含此内容
  3. 将插件:&#39; com.android.databinding&#39; 应用于您正在构建的应用模块
  4. 清洁
  5. 重建。检查下,如果build-&gt; indermediates-&gt;您的包名称&gt;生成包含ActivityMainBinding类的数据绑定文件夹。
  6. 或者,如果您想查看生成的来源。

    1. classpath&#39; com.neenbedankt.gradle.plugins:android-apt:1.7&#39; - &gt;适用于您的主模块。
    2. 申请插件:&#39; com.neenbedankt.android-apt&#39; - &gt;给你的app模块
    3. apt&#39; com.android.databinding:编译器:1.0-rc0&#39; - &gt;包含在您的依赖项中。
    4. 这些类将在首次构建时生成。 另外,请确保您的应用模块中的 applicationId 与应用模块的AndroidManifest.xml中的包名称相同。 希望这会有所帮助。

答案 10 :(得分:1)

只是简单的重启对我不起作用。我必须Invalidate Caches and Restart然后我才能看到绑定类。对于那些不知道的人来说,它位于File菜单下。

答案 11 :(得分:1)

我的经验是,在单击“构建>重建项目”后,Android Studio 3.1.3生成了数据绑定类。该文件存储在:

\ Project \ app \ build \ generated \ source \ apt \ development \ debug \ project \ android \ app \ databinding

但是,Android Studio still 在源代码中将绑定类报告为“未知”。

要最终解决该问题,我手动添加了 import 语句:

  

导入project.android.app.databinding。*;

答案 12 :(得分:0)

嗨,也许你可以试试这个,也可以在 build.gradle(:app) 中包含这个

在android块内

构建功能{ 视图绑定真 }

对我有用,也许对你也有用

答案 13 :(得分:0)

我遇到了一个类似的问题,这里没有提到。就我而言,我错误地将<Layout>添加为标签,而不是<layout><Layout>显然是有效标签,因为Android Studio没有抱怨(除了<layout>不需要的layout_width和layout_height之外)。大写的差异将以类似的行为表现出来,即使<Layout>是有效的标记,并且构建正确定义了.gradle文件以支持数据绑定。

就我而言,为了使ActivityMainBinding有效导入并在以下位置引用,我并不需要定义<data>标记:

private lateinit var binding: ActivityMainBinding

当我遇到以下行为时,我正在研究以下代码实验室:https://developer.android.com/codelabs/kotlin-android-training-data-binding-basics/index.html

答案 14 :(得分:0)

如果您不想重新启动android studio,一种方法是将activity_main.xml重命名为其他内容,例如activity_m.xml,然后将其重命名为activity_main.xml。它比重启android studio要快得多。

要重命名,请右键单击activity_main.xml并选择重构 =&gt;的重命名

答案 15 :(得分:0)

检查对象的字段访问级别,当我公开它在这里工作时

答案 16 :(得分:0)

<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

//记住需要 建设 - &GT;重建项目

答案 17 :(得分:0)

在我的情况下,我只是在<layout></layout>标签中包含了我的布局xml,而没有添加数据标签,我成功生成了数据绑定。希望这会有所帮助。

<data>
       <variable name="user" type="com.example.User"/>
</data>

答案 18 :(得分:0)

android-studio中一个奇怪的“bug”导致生成的BR.java文件不使用@Bindable字段,如果res / layout目录不存在,仍然只有_all属性

当我想创建一个“无活动”应用程序以拥有一个包含我不同的可绑定数据的库时,它发生在我身上。