所以这是一个误导性错误。
找到根本原因的最快方法是运行:
bash gradlew assembleDebug --debug
然后向上滚动并查找发生的真正错误。
但是,如果您仍然没有找到想要的答案,请继续阅读。
我将解释正在发生的事情的 30,000 英尺视图。这不是确切的顺序或确切的流程,它只是非常接近;)所以如果你知道更多,那么我会知道确切的顺序并注意通过链接进行更正,请随意,我不会阻止你 :)。
过程
R文件生成代码。
世代是有先后顺序的。
Gradle 会发挥它的魔力,拉取它的依赖项并启动它
警告和错误树优先,
然后 Android 在后台将所有 Kotlin 转换为 Java。是的,就是这样
对,我们心爱的 Kotlin 仍然必须是 Java 才能为我们编译
心爱的ART虚拟机。
然后它会运行并执行您为其创建的适配器
JVM 静态和其他一些任务。
接下来,它首先编译所有 xml 数据绑定文件以创建
生成的数据绑定文件。
如果一切顺利,它会继续处理资产和
资源。它为您创建的每个资源创建指针或 ID
代码中的参考。接下来它将运行并开始编译
之后的代码和打包过程。
非常简单的过程,但问题就在这里。
误导性错误
如果在 R 生成完成之前任何步骤失败,则不会生成 R。有时你只需要一个简单的重建,有时你只需要一个简单的 File->Invalidate Cache and Restart。但是,您的 gradle、xml、数据绑定或适配器中的代码问题通常会阻止编译器进入 R 生成阶段。
那么下一个问题是
“好吧,如果错误毫无价值或
不存在”。
首先让我们谈谈这些错误的多种表现方式。
- 发现重复的数据绑定类
- 第 # 行的 xml 绑定错误
- 找不到匹配的 bind:customAdapterMethod 签名
- 找不到正确项目的 R 文件,仅显示子模块的导入选项或不正确的命名空间 R 文件。
- 找不到活动/片段的 DataBindingUtility 或 DataBinding
- 还有许多其他不同的方式,太多了,无法一一列举
接下来,让我们谈谈导致问题的潜在候选人。因为有很多大声笑。
- Gradle 同步问题
- Gradle 或工具的错误版本,您可能在上次修改 gradle 文件时走得太远了。尝试退回一个版本并“使缓存无效并重新启动”,如果修复它,很好,如果没有,请继续阅读。
- 缓存问题(文件->重新启动并使缓存无效)
- xml 元素的命名空间错误
- 具有错误 ID 或引用 ID 无序的 xml 元素(即,您说对齐到 xml 文档中较低的元素的右侧,然后是尝试引用它的兄弟元素)
- xml 数据绑定问题引用不存在或未正确键入的命名空间或成员
- xml 数据绑定问题在非自动填充的地方,比如使用适配器的自定义属性,因为这些更难发现。即绑定:myCustomMethod=@"myObject.mistypedProperty()"
- JVM 静态适配器存在问题或重复签名
- Strings 或 Dimens 文件或任何其他 xml 文件中的重复字符或错误字符
- 标记为@Binding 的私有变量,没有访问它的属性
- 标记为 @Binding 的成员变量与父类方法匹配,导致重复,几乎不可能出现错误
- 类型不匹配,例如使用采用 (Int) 的适配器,但您通过数据绑定传递 (Int?),直到编译时它才能被 JVM Statics 识别
- 您在弹出窗口中选择了 IMPORT 以导入子模块的 R 文件而不是应用程序文件
- 在子类或父类中具有可绑定成员,但在父类或子类的 XML 用法中没有为类强制转换提供完全限定的命名空间。由于数据绑定编译器不够智能,无法实现为类 Foo 提供的变量也是 parentFoo 基类,因此您必须将其限定为 android:text="@((com.path.parentFoo)foo).parentMethod"
- 在类中有一个方法名称,它与“从@Binding 成员变量生成的属性”匹配,即作为变量的 firstName,但是在父类或子类中有一个名为 getFirstName 的方法,因为您现在正在匹配一个方法将自动生成的名称,从而导致 dataBindingUtility 重复类错误。
- 还有更多原因,但这应该会给您提供一系列值得关注的地方,但这个列表可以继续下去。
不幸的是,这种情况经常发生在前沿技术中,其中 UI 工具还没有跟上基于终端的工具的速度。所以我建议你在终端中从项目根目录运行
bash gradlew assembleDebug --debug
当它失败时,它会。开始向上滚动日志,直到找到红色的地方,您可以看到实际失败并阻止下一阶段的发生。
当您开始处理数据绑定时,您会发现这特别有用。
提示:
当您开始处理数据绑定时,请确保您经常编译和运行,因为目标是在处理其他文件之前立即识别,以确保您不会破坏生成并使您的生活更容易了解您刚刚添加的代码在走得太远之前引起了问题。
在继续之前编译和运行确认没有问题的时间。
- 如果添加一些 JVM 静态编译并运行
- 如果将变量添加到要使用的 XML 中
- 如果您在 1 个文件中绑定到模型的属性
- 如果将绑定添加到 JVMStatic
- 如果您将可绑定成员或属性添加到模型中
- 如果重构将可观察成员变量或属性移动到子类或基类中
- 可能影响生成代码的任何其他 xml 或绑定相关元素。
就像我上面提到的,原因是为了避免进行如此多的更改,以至于找到与生成的数据绑定代码相关的一般模糊、可怕的错误成为故障排除的噩梦。我相信这些工具会有所改进,但现在,请帮自己一个忙,在更改数据绑定相关项目时经常编译和运行。
快乐编码