首页 > 解决方案 > 两个 Android 主题可以包含共同的值而不相互继承吗?

问题描述

我试图通过将功能分解为多个模块来保持我的应用程序清洁。

:App
:Features:Foo
:Features:Bar
:Ux

我已经在 :Ux 模块的 theme.xml 中定义了我的应用程序的主题,然后在整个应用程序中使用它。

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
   ...
</style>

但是,我的一些功能具有我想添加到主题中并在整个功能中使用的自定义属性。所以我在:Features:Foo 和:Features:Bar 中添加了一个attrs.xml 和themes.xml。

<style name="Theme.MyApp.Foo" parent="Theme.MaterialComponents.Light">
   <item name="customFooViewColor">@android:color/holo_orange_dark</item>   
</style>

<style name="Theme.MyApp.Bar" parent="Theme.MaterialComponents.Light">
   <item name="customBarViewColor">@android:color/holo_green_light</item>   
</style>

但是现在我想在 :Features:Baz 中添加一个新功能,它可以托管来自 :Features:Foo 和 :Features:Bar 的片段,因此它的主题需要包含 :Feature:Foo 的 attrs.xml 中定义的自定义属性和:Feature:Bar 的attrs.xml,以及在:Feature:Foo 的themes.xml 和:Feature:Bar 的themes.xml 中定义的那些属性的相同值。

一种解决方案是将这些自定义属性及其值移动到 :Ux 模块中,但这会污染整个应用程序,其中包含仅在几个模块中需要的特定于功能的属性。

正如@ritesh4302 指出的那样,我可以通过添加对这些模块的依赖项来访问 :Feature:Foo 和 :Feature:Bar 中的 attrs.xml 文件:Feature:Baz ,因此另一种解决方案是复制每个 :Features 中的所有字段:Foo 和 :Features:Bar 进入 :Features:Baz。

在:特点:Foo

<style name="Theme.MyApp.Foo" parent="Theme.MaterialComponents.Light">
   <item name="customFooViewColor">@android:color/holo_orange_dark</item>   
</style>

在:特点:酒吧

<style name="Theme.MyApp.Bar" parent="Theme.MaterialComponents.Light">
   <item name="customBarViewColor">@android:color/holo_green_light</item>   
</style>

在:特点:巴兹

<style name="Theme.MyApp.Baz" parent="Theme.MaterialComponents.Light">
   <item name="customFooViewColor">@android:color/holo_orange_dark</item>   
   <item name="customBarViewColor">@android:color/holo_green_light</item>   
</style>

显然,这种值的重复是有问题的,因为现在我需要在多个位置更改值时更新它们。

有没有办法避免重复而不将所有内容都放在:Ux 中?有没有人写过一个可以实现这个的构建插件?

标签: androidandroid-themeandroid-module

解决方案


如果 :Feature:Baz 需要使用 :Feature:Foo 和 :Feature:Bar 编写的代码,那么您需要将它们添加为依赖项,并且一旦将它们添加为依赖项,您必须能够使用基本包中定义的自定义属性。


推荐阅读