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


73

数据绑定指南

  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,是的,我知道,它是beta版本。我只想尝试一下。
sowmia

根据本段,从Google的角度来看,可以使用该库发布应用程序。您只需要了解Beta的状态及其含义:***开发人员应该随时发布使用数据绑定库beta版本构建的应用,并要注意标准Android SDK和Google Play服务条款的适用性,以及在采用新的库或工具时,彻底测试应用程序始终是一个好主意。
于尔根'Kashban' Wahlmann

谁能指出生成的类/文件在项目中的位置?
CodyF

仅出于完整性考虑:所有生成的代码都在“ module_dir” / build /内部。在下面的资源中,按照java类的目录存在res目录,其中包含具有关联性的src(例如dataBinding)。这个结构是由gradle 2.2+生成的
lukassos

就我而言,如果xml文件中有元素<data> </ data>,那么databingclass会及时更新,或者仅在重新打开Studio IDE之后才更新。
弗雷迪(Freddie)

Answers:


93

您的布局名称是什么?

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

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

activity_main.xml-> ActivityMainBinding.java

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


在这种情况下,类以“ Activity”为后缀,而xmls为前缀,绝对令人困惑!
dVaffection

31
这没有回答“如何和何时”的问题。我和OP遇到相同的问题,绑定文件对我而言不是生成的。该答案仅告诉您有关命名约定的信息,而没有提供有关如何解决丢失文件问题的任何线索。
Siavash

2
@Siavash我不知道“如何和何时”,但是我遇到了类似的问题,而对我来说解决的是将所有xmlns:app =“ schemas.android.com/apk/res-auto ”放入其中布局标签,而不是顶视图标签。这只是我的疏忽,但它使我发疯,所以我认为我会把它转嫁给别人,以防它对别人有所帮助。
Aezur

请帮我,我有一个像com.asadmukhtar.show这样的包名,而xml文件名是activity_splash,启用数据绑定后,我的绑定文件总是像com.example这样的包中生成,为什么我遵循MVVM模型。请帮助我
阿萨德·穆赫塔尔

36

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

顺便说一句,如果您正在使用android-apt,请检查一下。因为它将导致绑定类无法生成。


是的,重启工作正常,Android Studio 2.1中仍然存在问题
Chatura Dilan

真正的和更好的无效缓存及重新开始......如果你创建布局后激活数据绑定..这种情况发生
马赫Abuthraa

作为08/16,如果打开了多个AndroidStudio实例,我将遇到此问题。我必须重新启动才能看到绑定后缀类。
BlackCath

和我一起,绑定文件存在于\Project\app\build\generated\source\apt\development\debug\project\android\app\databindingHOWEVER Android Studio 3.1.3中,报告该类为Unknown。使缓存无效,并且重新启动未修复它。
某处某人'18

同样,Android Studio不断产生错误com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers。真浪费时间!
某处某人

32

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

它必须以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包中生成的。


2
即使您没有使用Android Studio,gradle插件也会在注释处理阶段生成代码。没有Android Studio,您将不得不相信该类将被生成并自行导入Binding类。诸如“ import com.my.package.databinding.ActivityMainBinding;”之类的东西 for activity_main.xml
George Mount

1
当我只有<layout>而没有<data>时,不会生成类。当我向<data>添加一些<variable>时,就生成了类。
DavidVávra'15

感谢您的回答,没有<data>标签是我的问题。顺便说一句,即使没有添加变量也可以工作。
ScottyC '17

这为我解决了。需要该布局部分才能生成绑定
joehinkle11 '20

15

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

就我而言,为“ activity_main.xml”生成绑定类是行不通的。
但是重命名布局文件main_activity.xml就可以了。


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

14

规则

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

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

问题

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

这是hack

当您没有导入建议时

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

    import <yourpackage>databinding.ActivityMainBinding;
    

导入行仍然显示错误?

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

生成绑定类的快速技巧-

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

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

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

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

如果仍然有问题。让我知道在评论中,或查看此答案以更好地理解。


4

确保以下内容的布局:

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

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

如果你把你<data>fragment_main.xml布局,然后将其生成的类将是FragmentMainBinding

注意:阅读后这似乎很明显,但是在遵循android文档时,它很容易被忽略。



4

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

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

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

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

@Frank Cheng发布的重新启动Android Studio确实可以,但是每次创建新布局都需要重新启动它。我选择了这种命名方式,即我自己命名绑定类,因为它似乎可以正常工作。
velval 2016年

2

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


1

为了使android数据绑定正常工作,您必须使用android工具gradle(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 -> Rebuild project


1
这将导致在stackoverflow.com/questions/35250956/…中发布 错误(错误:(3,0)原因:org / apache / commons / lang3 / StringUtils)
Dika

1

面临同样的问题。

“无法解析ActivityMainBinding”的原因是未生成您的绑定文件。尝试清理和重建项目。另外,请确保您已遵循以下步骤:

  1. classpath“ com.android.databinding:dataBinder:1.0-rc4” ->将此包含在主模块构建文件中
  2. 将插件:“ com.android.databinding”应用到您的应用模块正在构建的
  3. 清洁
  4. 重建。检查下是否生成了包含ActivityMainBinding类的build-> indermediates->您的包名称-> databinding文件夹。

或者,如果您想查看生成的源。

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

这些类将在首次构建时生成。还要确保您的应用程序模块中的applicationId与您的应用程序模块的AndroidManifest.xml中的包名称相同。希望这可以帮助。


1

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

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

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

为了最终解决它,我手动添加了import语句:

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


0

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

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


0

就我而言,我只是将布局xml封装在<layout></layout>标签中,仅此而已,而没有添加数据标签,因此我成功地生成了数据绑定。希望这可以帮助。

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

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

//记住需要Build-> Rebuild Project



0

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

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


0

我遇到了一个类似的问题,这里还没有提到。就我而言,我错误地将<Layout>标记添加为<layout><Layout>显然是有效的代码,因为Android Studio没有抱怨(除了不需要不需要的layout_width和layout_height <layout>)。大小写差异将以类似的行为表现出来,即使您无法在MainActivity类中导入数据绑定类(在我的情况下,导入com.example.android.aboutme.databinding.ActivityMainBinding)<Layout>是有效的标记并且定义了build.gradle文件正确地支持数据绑定。

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

private lateinit var binding: ActivityMainBinding

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

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.