未生成数据绑定类

Rav*_*avi 70 data-binding android android-databinding

我在我的项目中使用数据绑定,当使用时<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>
Run Code Online (Sandbox Code Playgroud)

现在,如果我ActivityMainBinding在我的活动/片段中写入,则显示该类不可用的错误.但是<variable>在我的xml文件中包含它后,它能够生成ActivityMainBinding类.

Android Studio:2.1.3
Classpath:com.android.tools.build: grad :2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Khe*_*raj 141

我没有得到任何令人满意的答案.所以这里有一些提示,它是我的数据绑定知识的摘要.

解决DataBinding问题的提示

更新

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

查看最新的Android Studio最新的Gradle插件.

Orignal解决方案

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

逐个检查这些要点.任何这些都可以使你的工作完成.第3点到最后是非常重要的,所以不要错过它们.

1.检查是否启用了数据绑定

你应该有数据绑定启用build.gradle.如果没有,则添加此项并同步.

android {
...
   dataBinding {
        enabled = true
    }
...
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

3.自动生成绑定类名?

创建绑定布局后,应生成数据绑定类.

如果您的布局名称是蛇的情况下 activity_main.xml,然后数据绑定类将在生成驼峰ActivityMainBinding.

4.看不到导入建议?

有时当您键入时ActivityMai...,它不显示建议,在这种情况下手动导入.

import <yourpackage>databinding.ActivityMainBinding;
Run Code Online (Sandbox Code Playgroud)

5.阅读Build Fail Logcat

如果构建失败,则不会生成布局中的绑定类和新变量.因此,首先让项目通过按Ctrl + F9(生成>制作项目).

  • 如果构建失败,那么看看什么是错误,通常我们在布局字段中有错误.错误日志将指出错误行号和问题.
  • 绑定可能会失败导致一些愚蠢的错误,如语法错误或缺少导入.在这种情况下,您将获得logcat充满绑定类错误.但是你应该阅读完整的logcat找到合适的问题.

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

我总是这样做,因为它比Rebuild/ Makeproject 花费的时间少得多.

  • 从文件>关闭项目关闭项目
  • 从最近再次开放

请注意,我更喜欢Close和Open from Recent,因为它比Rebuild/Restart IDE花费的时间少得多.

7.重建项目

如果仍未生成您的课程.(有时候我们粘贴布局文件,然后就会发生).然后从(不构建或制作项目)重建项目.它将生成您的数据绑定类.(重建为我做魔术.)Build> Rebuild

8.拥有最新的Android Studio

在将AS更新到Android Studio 3.2之后,我觉得在数据绑定自动生成中有很多错误修复.所以你也应该有最新的AS.

解决方案 <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>
Run Code Online (Sandbox Code Playgroud)

通常当我们将变量放在布局中时,它会创建它的getter和setter.我们可以使用binding.setItem(item);binding.getItem();,但如果你看不到那些方法,那么请阅读以下信息.

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

如果您已经创建了一个数据变量 - <variable在您的布局中并且它没有在数据绑定类中显示其setter和getter,那么从最近的项目中关闭并打开.

2.更改类型后清洁项目

如果您<variable在布局中更改了某些类型并且getter setter类型未更改,则清除项目(Build> Clean Project)

最后的话

最后,如果仍未生成绑定类,那么我们拥有最强大的武器.- 重启Android Studio:D

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

这就是我为解决数据绑定错误所做的一切.如果您有任何进一步的问题,可以在这里发表评论.

  • 如果问题仍然存在... (8) Invalidate &amp; restart.... 如果没有解决, (9) 更改 dataBinding { enabled = false } ... 构建,然后 dataBinding { enabled = true } 再次构建.... (2认同)
  • 拯救了我的一天。我的布局文件中缺少 &lt;layout&gt; 包装。谢谢! (2认同)

小智 22

DataBinding类自动生成.

如果你的xml名称是activity_test,那么Binding类将是ActivityTestBinding.

但,

dataBinding {
        enabled = true
    }
Run Code Online (Sandbox Code Playgroud)

布局应该以root身份布局

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>
Run Code Online (Sandbox Code Playgroud)


小智 12

我遇到过同样的问题.在阅读了android sdk文档之后,只会创建预期的文件名,但如果没有这样做,则无需做什么.我注意到经过一些研究后,将名称空间删除到如下面的布局元素(使用你的例子),它对我有用.

    <?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> 
Run Code Online (Sandbox Code Playgroud)


Krz*_*cki 10

在我的例子中,Binding类是生成并到位的(但我认为不是)...但它不会自动将所述类的导入添加到activity/fragment import部分......所以... OPTION +输入:)

  • Bingo,为我工作,虽然我不得不手动输入导入,intellisense没有出于任何原因提供选项. (2认同)

Sam*_*iya 9

dataBinding {
        enabled = true
    }
Run Code Online (Sandbox Code Playgroud)

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

android.databinding.enableV2=true
Run Code Online (Sandbox Code Playgroud)

更新:

要启用数据绑定,请使用,

android {
    ...
    buildFeatures {
        dataBinding true
    }
}
Run Code Online (Sandbox Code Playgroud)

请点击此链接: https ://developer.android.com/jetpack/androidx/releases/databinding


Xtr*_*ica 8

在正确设置它之后(包括xml命名空间并将所有内容包装进去<layout>),对我有用的是做Build - > Make项目.Nor Clean Project或Rebuild Project也做到了.我在Android Studio 2.3.1中,使用26.0.2构建工具.不需要<data>标签.


COR*_*ian 6

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

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

活动或片段类的名称命名法在前缀方面可能有所不同。因为后缀总是Binding。

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

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

GL

来源


Mah*_*bar 5

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


wri*_*ris 5

我有同样的问题。我在重构时犯了一个错误。autogen 绑定类的名称来自 xml 布局文件。

fragment_name.xml - > FragmentNameBinding