2016-08-26 129 views
1

我的Android应用程序有一个主要的项目模块,在样式文件中有以下声明。此主题用于“应用程序”标签上的Manifest文件中,以便“应用程序”元素中的所有组件具有相同的主题。Android解析样式属性和属性?

<!-- 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”和“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> 

回答

0

所以这里是我如何解决这个问题。

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> 

请注意分辨值的颜色,而不是它本身,如“机器人?:ATTR/colorControlNormal”从主题引用和“机器人:ATTR/colorAccent”,或它们的变体。

库模块中的drawable 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>