覆盖Android

时间:2019-06-12 11:44:54

标签: android layout binding overriding android-databinding

开发应用程序时出现以下错误:

我正在使用一些“默认”库模块构建多个应用程序。这些库模块均使用数据绑定,并包括默认布局和功能。有时,我会被要求更改库模块中找到的某些内容的用户界面,然后遇到麻烦。

让我们想象以下情况:

图书馆A:

  • 启用了数据绑定

  • 创建LibActivityA和layout_A.xml(根标记为)

  • 在LibActivityA内部使用LayoutABinding以您的自由意志

AppB:

  • 对LibraryA的依赖

  • 已启用数据绑定

  • AppB中的某些活动启动了LibActivityA,并且一切正常(LibraryA的布局没有更改)

  • 我做了一个发行版APK,可以正确使用

AppC:

  • 对LibraryA的依赖

  • 已启用数据绑定

  • 我有一个请求,将在layout_A.xml中找到的元素移动到屏幕底部,比如说

  • 我创建另一个layout_A.xml文件(根标记为)并调整所需内容(同时保留所有其他成员以避免运行时错误)。

  • 我运行该应用程序,并在运行时收到类强制转换异常

  • 快速搜索,我发现生成的LayoutABinding在我的应用程序包中,因此我使用https://developer.android.com/topic/libraries/data-binding/generated-binding#custom_binding_class_names将LayoutABinding移到与LibraryA中完全相同的包中。

  • 再次运行该应用程序,一切都很好,香槟酒就出来了!

  • 点击生成签名的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和整个Internet,似乎没有人能成功完成我想要的事情:从使用dataBinding的库中覆盖资源文件,以便为使用lib的某些应用提供一个略有不同的视图。 在使用数据绑定之前,一切都进行得很顺利,实际上,我必须确保findViewByIds不会返回null,所以我可以使用新的布局。

1 个答案:

答案 0 :(得分:0)

以某种方式,我最终深入研究了DataBinding类的实现,并逐一排除了错误。 我最终要做的是:

AppC:

  • 我创建了另一个layout_A.xml文件,但根标记不再存在,因此它没有给出类强制转换异常;我调整了布局文件中所需的内容。

  • LibActivityA使用DataBindingUtil.setContentView(),因此在资源合并之后,R.layout.layout_A将是AppC中的那个

  • 在AppC的layout_A.xml内部,我在视图上手动设置了标签:根标签获取标签=“ layout / layout_A_0”,任何ViewGroup类型的直接子对象都获取标签=“ binding_ [子编号]”。

手动设置标签似乎可以使最新的DataBinding生成的类按预期工作。我非常确定这不是做到这一点的方法,但这是我发现的唯一未完全删除数据绑定的方法:(

我非常确定这不是我们应该使用DataBinding库的方式,因此我在这里打开了一个凭单:https://issuetracker.google.com/issues/135043330