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

Posted

技术标签:

【中文标题】Android - DataBinding - 如何以及何时生成绑定类?【英文标题】:Android - DataBinding - How and when the Binding classes will be generated? 【发布时间】:2015-09-30 16:10:37 【问题描述】:

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);

感谢任何帮助。谢谢

【问题讨论】:

@DerGol...lum,我知道,这是测试版。我只是想试试看。 根据此段落,从 Google 的角度来看,使用此库发布应用程序是可以的。您只需要了解 beta 状态和影响: *** 开发人员应该可以随意发布使用 Data Binding 库 beta 版本构建的应用程序,并注意标准 android SDK 和 Google Play 服务条款适用,以及在采用新的库或工具时,彻底测试您的应用总是一个好主意。 谁能指出生成的类/文件在项目中的位置? 只是为了完整性:所有生成的代码都在“module_dir”/build/generated。下面根据资源有 res 目录,根据 java 类有 src 具有亲和力(例如 dataBinding)。这个结构是gradle 2.2+生成的 在我的情况下,如果xml文件中有元素,databingclass会及时更新,或者只有在重新打开studio IDE后才会更新。 【参考方案1】:

您的布局名称是什么?

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

这意味着生成的类名将取决于您的布局名称 activity_main.xml -> ActivityMainBinding.java

我认为你的活动名称是“main_activity”,所以生成的绑定类名称应该是 MainActivityBinding 而不是 ActivityMainBinding

【讨论】:

在这种情况下,类以“Activity”为后缀,而 xml 为前缀,这绝对令人困惑! 这并没有回答“如何以及何时”的问题。我遇到了与 OP 相同的问题,绑定文件不是为我生成的。这个答案只是告诉你命名约定,并没有提供任何关于如何解决丢失文件问题的线索。 @Siavash 我不知道“如何和何时”,但我遇到了类似的问题,为我解决的问题是将所有 xmlns:app="schemas.android.com/apk/res-auto" 东西放入布局标签而不是顶视图标签。这只是我的一个疏忽,但它让我发疯了,所以我想我会把它传递下去,以防它帮助别人。 请帮助我,我有一个像 com.asadmukhtar.show 这样的包名,xml 文件名是 activity_splash,在数据绑定启用后,我的绑定文件总是在像 com.example 这样的包中生成,为什么会发生这种情况我正在关注MVVM 模型。请帮助我【参考方案2】:

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

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

【讨论】:

是的,重启工作正常,问题在 Android Studio 2.1 中仍然存在 正确且更好地使缓存无效并重新启动...如果您在创建布局后激活数据绑定,则会发生这种情况.. 2016 年 8 月,如果打开了多个 AndroidStudio 实例,我会遇到此问题。我必须重新启动才能看到绑定后缀类。 对我来说,绑定文件存在于\Project\app\build\generated\source\apt\development\debug\project\android\app\databinding 但是Android Studio 3.1.3 将该类报告为未知。 Invalidate Caches and Restart 并没有修复它。 另外,Android Studio 不断生成错误com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers。真是浪费时间!【参考方案3】:

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

它必须以 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 应自动完成课程。另外,默认在&lt;your.app.package&gt;.databinding包中生成。

【讨论】:

即使你没有使用Android Studio,gradle插件也会在注解处理阶段生成代码。如果没有 Android Studio,您必须确信该类将被生成并自己导入 Binding 类。类似“import com.my.package.databinding.ActivityMainBinding;”对于activity_main.xml 只有 而没有 时没有生成类。当我用一些 添加 时,生成了类。 感谢您的回答,没有 标签是我的问题。顺便说一句,即使不添加变量也可以工作。 这为我解决了。生成绑定需要该布局部分【参考方案4】:

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

就我而言,为“activity_main.xml”生成绑定类不起作用。 但是将布局文件重命名为 main_activity.xml 效果很好。

【讨论】:

它也对我有用。从现在开始,我将为我的所有活动/片段使用“xxxxxx_activity.xml”作为新的命名约定。谢谢!【参考方案5】:

规则

布局名称在snake_case,生成的绑定类名称为PascalCase

如果您的布局名称是activity_home.xml,那么绑定类名称将 是ActivityHomeBinding.class

问题

    很多时候你没有得到 DataBinding 类的导入建议。 当布局出现问题时,不会生成绑定类。 构建失败时绑定类不可用

这是破解

当您没有收到导入建议时

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

import <yourpackage>databinding.ActivityMainBinding;

导入行还是报错?

如果您的导入行显示错误,请尝试 ma​​ke project (ctrl + F9) / Build> Make Project。 .
    如果由于某些错误导致构建失败,则解决它。 如果构建成功,则会生成绑定类。

生成绑定类的快速hack-

如果未生成绑定类,则关闭项目(文件 > 关闭项目)并从最近打开

请注意我建议从最近开始关闭和打开,因为它比重建 / 更少的时间 >重启IDE。

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

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

如果您仍有问题。在 cmets 中让我知道,或查看this answer 以获得更好的理解。

【讨论】:

【参考方案6】:

确保以下布局:

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

如果您正在寻找 ActivityMainBinding,则在 activity_main.xml 中。在大多数样板项目中,您将内容视图设置为 activity_main.xml,然后将 fragment_main.xml 膨胀。

如果您将&lt;data&gt; 放在 fragment_main.xml 布局中,则生成的类将是 FragmentMainBinding

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

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

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

【讨论】:

@Frank Cheng 发布的重新启动 Android Studio 确实有效,但是每次创建新布局时重新启动它会很乏味。我选择了我自己命名绑定类的选项,因为它似乎可以正常工作。【参考方案9】:

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

【讨论】:

【参考方案10】:

要使 android 数据绑定正常工作,您必须使用 gradle 的 android 工具 (com.android.tools.build:gradle) >=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 -&gt; Rebuild project

【讨论】:

这将导致在***.com/questions/35250956/…中发布错误(错误:(3,0)原因:org/apache/commons/lang3/StringUtils)【参考方案11】:

面临同样的问题。

“无法解析 ActivityMainBinding”的原因是您的 Binding 文件未生成。尝试清理并重建项目。 还要确保您已按照以下步骤操作:

    classpath "com.android.databinding:dataBinder:1.0-rc4" --> 在主模块构建文件中包含这个 将插件:'com.android.databinding' 应用到您正在构建的应用模块 干净 重建。检查下,如果 build->indermediates->your package name->databinding 文件夹生成包含 ActivityMainBinding 类。

如果您想查看生成的源代码。

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7' -->应用于你的主模块。 应用插件:'com.neenbedankt.android-apt' --> 应用到你的应用模块 apt 'com.android.databinding:compiler:1.0-rc0' --> 包含在您的依赖项中。

这些类将在第一次构建时生成。 还要确保您的应用模块中的 applicationId 与您的应用模块的 AndroidManifest.xml 中的 package name 相同。 希望这会有所帮助。

【讨论】:

【参考方案12】:

我的经验是,Android Studio 3.1.3 在我点击“Build > Rebuild Project”后生成了数据绑定类。该文件存储在:

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

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

为了最终修复它,我手动添加了 import 语句:

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

【讨论】:

【参考方案13】:

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

当我想创建一个“无活动”应用程序以拥有一个包含我不同的可绑定数据的库时,我发生了这种情况。

【讨论】:

【参考方案14】:

在我的情况下,我只是将我的布局 xml 包含在 &lt;layout&gt;&lt;/layout&gt; 标签中,就是这样,没有添加数据标签,我成功地生成了数据绑定。希望这会有所帮助。

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

【讨论】:

【参考方案15】:
<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

//记住需要 构建-> 重建项目

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

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

要重命名,请右键单击 activity_main.xml 并选择 Refactor => Rename

【讨论】:

【参考方案18】:

我遇到了一个类似的问题,这里还没有提到。就我而言,我错误地将&lt;Layout&gt; 添加为标签而不是&lt;layout&gt;&lt;Layout&gt; 显然是一个有效的标签,因为 Android Studio 没有抱怨(除了需要 &lt;layout&gt; 不需要的 layout_width 和 layout_height 之外)。大小写差异将体现在类似的行为中,即使&lt;Layout&gt; 是有效标签且 build.gradle文件已正确定义以支持数据绑定。

在我的例子中,我不需要定义 &lt;data&gt; 标记,以便 ActivityMainBinding 有效导入并被引用:

private lateinit var binding: ActivityMainBinding

当我遇到这种行为时,我正在处理这个 codelab:https://developer.android.com/codelabs/kotlin-android-training-data-binding-basics/index.html

【讨论】:

【参考方案19】:

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

在 android 块内

构建功能 视图绑定真

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

【讨论】:

【参考方案20】:

activity_main.xml 文件需要以 layout 标签开头,如下所示。

【讨论】:

schemas.android.com/apk/res/android" xmlns:app="schemas.android.com/apk/res-auto"> 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于Android - DataBinding - 如何以及何时生成绑定类?的主要内容,如果未能解决你的问题,请参考以下文章

Android databinding不存在

Android11——DataBinding的使用

ClassNotFoundException:没有找到类“android.databinding.DataBinderMapper”

Android:DataBinding 和 ViewBinding 的区别

android dataBinding详解

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