Android 正在解析样式属性和属性?

Android Resolving style properties and attributes?

我的 Android 应用程序有一个主项目模块,它在样式文件中有以下声明。此主题在 "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依赖声明,Project Module依赖于Library Module,当然反过来也不行。

我如何在 运行 时根据主项目模块中的适当上下文(Activity 实例)?

<?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 在库模块中。注意格式是 "integer",虽然属性应该是颜色。

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