我在项目中使用数据绑定时,在我的xml绑定类中使用<layout>
和<data>
时没有生成。
例如我有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>
现在,如果我在我的activity / fragment中编写ActivityMainBinding
,则会显示该类不可用的错误。但是在我的xml文件中包含<variable>
之后,它就可以生成ActivityMainBinding
类。
Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
答案 0 :(得分:86)
我没有得到令人满意的答复。因此,这里有一些技巧,这些技巧是我的数据绑定知识的总结。
为了获得更准确的错误和建议,我强烈建议将Android Studio和Gradle插件版本更新为最新版本。因为在AS 3.2版本之后我没有遇到很多问题。
请参见Latest Android Studio和Latest Gradle Plugin。
阅读此答案后,您不会陷入类和数据变量的数据绑定自动生成问题。
一一检查这些点。这些都可以使您的工作完成。 最后的第三点非常重要,请不要错过它们。
您应该在build.gradle
中启用数据绑定。如果没有,则添加它并同步。
android {
...
dataBinding {
enabled = true
}
...
}
现在,如果要生成数据绑定类,则应用数据绑定包装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>
您的数据绑定类应在创建绑定布局后生成。
如果您的布局名称为蛇形
activity_main.xml
,则为数据绑定类 将以驼峰式形式生成,例如ActivityMainBinding
。
有时,当您键入 ActivityMai...
时,它不显示建议,在这种情况下,手动导入。
import <yourpackage>databinding.ActivityMainBinding;
如果构建失败,则不会生成布局中的绑定类和新变量。因此,首先通过 Ctrl + F9(生成>创建项目) 创建项目。
我总是这样做,因为它比Rebuild
/ Make
项目要花费更少的时间。
请注意,我更喜欢最近中的关闭并打开,因为它所需的时间比重建/重新启动IDE 要少得多。 >。
如果仍然没有生成您的类。 (有时,当我们粘贴布局文件时,它会发生)。然后从Build> Rebuild
重建项目(不构建或制作项目)。它将生成您的数据绑定类。 (重建为我带来了魔力。)
将AS更新为Android Studio 3.2后,我感觉到数据绑定自动生成中的许多错误已修复。因此,您还应该拥有最新的AS。
<variables
<data>
<variable
name="item"
type="com.package.Model"/>
</data>
通常,当我们将变量放入布局时,它会创建它的getter和setter。我们可以使用binding.setItem(item);
和binding.getItem();
,但如果看不到这些方法,请阅读以下信息。
如果您在布局中创建了数据变量- <variable
,并且它未在数据绑定类中显示其setter和getter ,则< strong>关闭并从最近打开您的项目。
如果您在布局中更改了某些 <variable
的类型,并且getter setter类型没有更改,则 Clean project(Build> Clean Project
) >
最后,如果仍然没有生成您的绑定类,那么我们拥有最强大的武器。 -重新启动Android Studio:D
这就是我为解决我的数据绑定错误所做的一切。如果您还有其他问题,可以在这里发表评论。
答案 1 :(得分:20)
自动生成DataBinding类。
如果你的xml名称是activity_test,那么Binding类将是ActivityTestBinding。
但是,
for(int arrElm : tempArray){
tail += Math.abs(arrElm);
}
布局应该以root身份布局
dataBinding {
enabled = true
}
答案 2 :(得分:10)
我有同样的问题。在阅读了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>
答案 3 :(得分:8)
正确设置它(包括xml命名空间并将所有内容包装到<layout>
)之后,对我有用的那个就是做Build - &gt;制作项目。 Nor Clean Project或Rebuild Project也做到了。我在Android Studio 2.3.1中,使用26.0.2构建工具。不需要<data>
标记。
答案 4 :(得分:8)
在我的例子中,Binding类已经生成并到位(但我认为它不是)...但是它不会自动将所述类的导入添加到activity / fragment import部分...所以... OPTION + ENTER:)
答案 5 :(得分:5)
如果您做基础工作,则可以在项目中启用数据绑定,例如在更改xml代码但未更改时,使用在gradle中启用并在xml中使用 layout标签为这些xml生成新的数据绑定类,您可以使用一种快速的方法在 gradle-> other-> databindinggenbaseclassesDebug 中仅生成数据绑定类,这比建立整个项目要快得多。它只生成数据绑定类。
答案 6 :(得分:2)
数据绑定类是在构建期间生成的,因此在应用程序的Gradle构建中启用数据绑定并使用布局标记包围xml之后,您应该重建应用程序。如果这没有帮助,请删除您的构建文件夹并再次执行。
答案 7 :(得分:2)
dataBinding {
enabled = true
}
要启用新的数据绑定编译器,请在gradle.properties文件中添加以下选项:
android.databinding.enableV2=true
答案 8 :(得分:1)
如果可能的话,我唯一想象的就是你没有
dataBinding {
enabled true
}
你的gradle文件中的。如果不只是将它添加到gradle文件中。 即
android {
......
dataBinding {
enabled true
}
}
然后同步您的项目。如果它仍然失败,您可能需要对Android工作室进行无效/重启
答案 9 :(得分:1)
感谢this answer here-似乎需要清除“布局名称空间” ,或者您需要一个新的唯一名称。
以下是对我有用的选项:
为布局创建一个新的名称,以确保可以生成它。这解决了我的问题,我有一个首先创建的布局,没有数据绑定-我们称之为fragment_abc.xml
。当我尝试向其添加数据绑定时,即使在多次清除缓存和重新启动调用之后,也无法识别它。但是,一旦我复制了布局fragment_abc2.xml
,就立即获得了生成的数据绑定.java / .class对象。
看到上述工作之后,我试图从模块中删除/ build文件夹,然后重新构建项目-这样做是为了获得原始布局的数据绑定。
答案 10 :(得分:1)
在使用多模块Android应用程序时,请检查您的绑定类路径。也许您应该使用:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
插入:
import com.yourcompany.app.android.databinding.FragmentABCtBinding
答案 11 :(得分:1)
如果最近有人将现有项目迁移到 androidx ,那么您需要替换导入的内容
import com.yourpackagename.BR;
到
import androidx.databinding.library.baseAdapters.BR;
Google终于有2天的解决方案了,哪一个对我有用。
答案 12 :(得分:1)
如果answer对您不起作用,那么我的建议很简单但有效。
这个想法是要确定是哪个组件导致了问题。为此,请在custom_fragment.xml
中对CustomFragment.kt
的所有行及其用途进行注释,并保留如下所示的最低要求。
<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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/test"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</layout>
Apply Code Changes
(Ctrl + Alt + F10)执行应用程序的同时将组件添加到组件中,直到应用程序崩溃为止,即您发现故障。数据绑定日志有时描述性不强,这是查找故障组件的通用策略。
GL
答案 13 :(得分:0)
答案 14 :(得分:0)
如果要实现可序列化->,则必须实现可序列化
否则,您将收到此错误。希望将来对某人有帮助
就我而言,我使用的是Parcel库。我错过了在子类中对@Parcel进行注释
答案 15 :(得分:0)
除了上述步骤外,您还可以检查变量类型。确保它是TextView的String或与BindingAdapter
中定义的相同。
例如:
data class MyDataObject(val name: String, val age: Int)
和XML:
android:text="@{dataobject.age}"
这将导致上述错误。要解决此问题,您可以将age变量设置为String类型,也可以将String导入XML并使用String.valueOf(age)
,如下所示:
<data>
<import type="String" />
...
</data>
在您的TextView中:
android:text="@{String.valueOf(dataobject.age)}"
答案 16 :(得分:0)
如果您的XML文件有问题,将不会生成数据绑定类 。一个快速解决方案是遍历XML文件并检查语法错误(通常以红色突出显示)。错误可能以不存在或错误的引用,印刷错误等形式出现。
本质上,只需确保XML代码中没有红色下划线的行即可。完成后,将重新生成您的Databinding类。
我希望这会有所帮助。快活的编码!
答案 17 :(得分:0)
为每个布局文件生成一个绑定类。默认情况下,类的名称基于布局文件的名称,将其转换为Pascal大小写并向其添加Binding后缀。上面的布局文件名是activity_main.xml,因此相应的生成类是ActivityMainBinding。此类包含从布局属性(例如,用户变量)到布局视图的所有绑定,并且知道如何为绑定表达式分配值。
活动名称或片段类的名称在前缀方面可能有所不同。因为后缀始终是Binding。
在遵循Khemraj和使缓存无效/重新启动的响应之后,您应该重写ActivityBinding或FragmentBinding 以获取有关已经存在的类的IDE建议。生成并且请勿对导入进行硬编码。
在我的情况下,我试图将类名倒退为FragmentCompetitionsBinding
而不是CompetitionsFragmentBinding
。
GL
答案 18 :(得分:0)
在我的情况下,未生成数据绑定类,因为我已经删除了mipmap Android资源目录。我重新创建了res / mipmap /目录,并恢复了数据绑定类。
答案 19 :(得分:0)
我遇到了类似的问题,即DataBinding无法生成 BindingImpl 类。 在我的情况下,是数据类中的方法使用了一个名称错误的问题: 该模型包含方法 onSignInCliked(),在布局中,我使用了 onSigninCliked()。请注意登录与登录。
错误消息还不够,仅当我将构建脚本与stack-trace选项一起使用时,我才发现问题。
答案 20 :(得分:0)
答案 21 :(得分:0)
在某些情况下,您不会在生成的目录下看到文件,则可能是绑定了未在viewmodel中声明的属性。如果您在xml中这样做,从本质上讲不会给您带来皮棉错误。
答案 22 :(得分:0)
如果在DataBindingUtil.setContentView中出现以下错误
未解决的参考:activity_main
您需要做的就是删除以下导入语句
导入android.R
我在另一个论坛上找到了解决方案。 Source
答案 23 :(得分:0)
删除布局并撤消,并确保在此之后正确导入生成的绑定类。
答案 24 :(得分:0)
就我而言,我认为生成的类必须与我的常规类一起出现在src
文件夹中。另外,我认为生成的类的名称应该稍有不同。都是我的错可以在build
文件夹的build -> generated -> ...
路径中找到生成的类。如果您的活动中没有导入的生成类,请添加导入
import com.yourcompany.app.databinding.ActivityMainBinding;"
答案 25 :(得分:0)
我遇到了问题,问题出在布局中,所使用的字段不是字符串,而是日期。
至少在TexView组件上,所有字段都必须是文本才能使用。
如果使用命令进行构建 ./gradlew构建--stacktrace
这样可以更好地显示错误。
答案 26 :(得分:0)
我遇到了类似的问题,其中包装了布局,并在gradle文件中启用了数据绑定。主要活动仍无法理解或查看我的课程。对我来说固定的是添加绑定变量并导入绑定。从那里我刚刚构建了解决方案,然后它似乎知道了什么是类。从那里,我能够导入生成的骆驼案例类。
答案 27 :(得分:0)
我不知道它是否对您有用。只需重命名布局XML文件名。就像假设您的布局名称为 activity_main.xml 一样,只需将其重命名为 main.xml 之类,然后再次将其重命名为 activity_main.xml 。然后,您可以在 ActivityMainBinding 上看到导入选项。
希望它对您有用。
答案 28 :(得分:0)
我有同样的问题。你所做的一切都是正确的。你需要在xml中的数据标签内添加变量。为此,您应该创建一个示例模型类,并将其作为变量添加到数据标记中。
在此之前,您将无法看到生成的ActivityMainBinding。
答案 29 :(得分:-1)
1。在应用gradle中添加以下内容
dataBinding {
enabled = true
}
2。在xml布局中,编写以下代码
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.
答案 30 :(得分:-4)
使用类路径&#39; com.android.databinding:dataBinder:1.0-rc0&#39;