我的Android应用程序有一个主项目模块,在样式文件中有以下声明:这个主题在Manifest文件的"application"标签上使用,所以"application"元素中的所有组件都应用了相同的主题。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:colorPrimary" tools:ignore="NewApi">
@color/light_black
</item>
<item name="colorPrimary">@color/light_black</item>
<item name="android:colorAccent" tools:ignore="NewApi">@color/sapphire</item>
<item name="colorAccent">@color/sapphire</item>
<item name="android:colorBackground">@color/primary_background</item>
<item name="android:textColorPrimary">@color/title_color</item>
<item name="android:colorButtonNormal" tools:ignore="NewApi">@color/sapphire</item>
<item name="colorButtonNormal">@color/sapphire</item>
<item name="android:colorForeground" tools:ignore="NewApi">
@color/title_color
</item>
<item name="android:titleTextStyle">@style/toolbar_title</item>
<item name="android:navigationIcon" tools:ignore="NewApi">
?android:attr/homeAsUpIndicator</item>
<item name="navigationIcon">?android:attr/homeAsUpIndicator</item>
<item name="android:colorControlNormal" tools:ignore="NewApi">@android:color/white</item>
<item name="colorControlNormal">@android:color/white</item>
</style>
我在主项目模块旁边还有一个库模块,我将在那里放置最常用的视图、小部件和基本组件,这些组件可以在我的应用程序项目或组织内的其他应用程序中重用。至于Gradle的依赖声明,项目模块依赖于库模块,而不是相反。
我如何解决"colorAccent"one_answers"colorControlNormal"默认android属性在我的库模块组件代码库在运行时取决于在主项目模块适当的上下文(活动实例)的主题?
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<item android:color="?android:attr/colorControlNormal"
android:state_activated="false"
tools:ignore="NewApi"/>
<item android:color="?android:attr/colorAccent"
android:state_activated="true"
tools:ignore="NewApi"/>
</selector>
我是这样解决这个问题的
attrs.xml在库模块。注意格式是一个"整数",尽管属性应该是颜色。
<attr name="progressColorControlNormal" format="reference|integer" />
<attr name="progressColorAccent" format="reference|integer" />
因为主项目模块依赖于库模块,所以我可以在styles.xml文件中的主题定义中访问这些属性。
<item name="progressColorControlNormal">@android:color/white</item>
<item name="progressColorAccent">@color/sapphire</item>
请注意颜色的解析值,而不是来自主题本身的引用,如"?android:attr/colorControlNormal"one_answers"?android:attr/colorAccent"或它们的变体。
库模块中的可绘制xml现在自动解析主题颜色。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<item android:color="?progressColorControlNormal"
android:state_activated="false"
tools:ignore="NewApi"/>
<item android:color="?progressColorAccent"
android:state_activated="true"
tools:ignore="NewApi"/>
</selector>