android - 在android上覆盖布局和数据绑定生成的类
问题描述
我在开发我的应用程序时遇到以下错误:
我正在使用一些“默认”库模块构建多个应用程序。这些库模块都使用数据绑定并包含默认布局和功能。有时我会被要求更改在库模块中找到的东西的 UI,然后我就会遇到麻烦。
让我们想象以下场景:
图书馆A:
启用数据绑定
创建 LibActivityA 和 layout_A.xml(根标签为 )
在 LibActivityA 内部,您可以随意使用 LayoutABinding
应用程序B:
依赖库A
启用数据绑定
AppB 中的一些活动启动 LibActivityA,一切正常(LibraryA 没有布局更改)
我做了一个发布 apk 并且可以正确使用它
应用程序:
依赖库A
启用数据绑定
我有一个将 layout_A.xml 中的元素移动到屏幕底部的请求,比如说
我创建另一个 layout_A.xml 文件(根标签是 )并调整需要的内容(同时保留所有其他成员以避免运行时错误)。
我运行应用程序,在运行时我得到一个类转换异常
快速搜索我发现生成的 LayoutABinding 在我的应用程序包中,所以我使用https://developer.android.com/topic/libraries/data-binding/generated-binding#custom_binding_class_names 将 LayoutABinding 移动到与在中找到的完全相同的包中图书馆 A.
再次运行应用程序,一切都很好,香槟瓶出来了!
点击生成签名的 apk 以进行发布构建并收到以下错误:任务':app:transformDexArchiveWithDexMergerForVariantStoreRelease'的执行失败。
com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: 合并 dex 档案时出错:在https://了解如何解决该问题:/ /developer.android.com/studio/build/dependencies#duplicate_classes。程序类型已存在:com.company.librarya.databinding.LayoutABinding
我已经搜索了整个 StackOverflow 和互联网,似乎没有人能够成功地做我想做的事:覆盖使用 dataBinding 的库中的资源文件,以便为使用该库的某些应用程序提供稍微不同的视图。在使用数据绑定之前,一切都很顺利,事实上我必须确保 findViewByIds 没有返回 null ,所以我可以使用新的布局。
解决方案
不知何故,我最终深入挖掘了 DataBinding 类的实现并一一排除了错误。我最终做的是:
应用程序:
我创建了另一个 layout_A.xml 文件,但根标签不再存在,因此它不会给出类强制转换异常;我调整布局文件中需要的内容。
LibActivityA 使用 DataBindingUtil.setContentView() 所以资源合并后 R.layout.layout_A 将是来自 AppC 的
在 AppC 的 layout_A.xml 中,我在视图上手动设置了标签:根标签获取标签 =“layout/layout_A_0”,ViewGroup 类型的任何直接子标签 =“绑定_[子编号]”。
手动设置标签似乎可以使最新的 DataBinding 生成的类按预期工作。我很确定这不是这样做的方法,但这是我找到的唯一方法,而无需完全删除数据绑定:(
我很确定这不是我们应该使用 DataBinding 库的方式,所以我在这里开了一张票:https ://issuetracker.google.com/issues/135043330
推荐阅读
- reactjs - Material-UI CardMedia 不从 URL 加载动态图像,但适用于静态图像
- javascript - 从javascript中的字符串中删除最后一个&的干净方法
- python - 为什么这个函数返回 LinkedIn 而不是 Amazon?
- forms - 带有选项卡的 Magento 2 UiComponent 表单有空字段
- python - 如何以直观的方式格式化使用请求库下载的 CSV 数据?
- c++ - Qt5:使用 QCommandLineParser 类时出现奇怪的编译错误
- python - 如何从python中具有特定长度的文件中的列表中选择一个随机单词
- javascript - Crud 实时 SSE?
- asp.net-core - 如何从另一个 Razor 页面调用方法?
- html - 使用 HTML Width CSS 创建大型 CLS,有没有更有效的方法?