原来第三方库的style会覆盖主项目的style

在写泡网客户端,准备使用最新的design库,无赖遇到一个非常蛋疼的问题,无论我如何设置主题,都会出现

do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false 。。。

然而我的主题设置的完全没有问题:

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Main theme colors -->
        <!--   your app branding color for the app bar -->
        <item name="colorPrimary">@color/theme_primary</item>
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="colorPrimaryDark">@color/theme_primary_dark</item>
        <!--   theme UI controls like checkboxes and text fields -->
        <item name="colorAccent">@color/theme_primary</item>
        <item name="colorControlHighlight">@color/sa_green_transparent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
    </style>

这个问题困扰了我好几天。

一直以为是studio或者design库的bug,差点就放弃design库了。然而今天突然想到修改下主题的colorPrimary等属性,意外发现修改后颜色还是老样子。

看来这个主题完全没有起作用。

是不是因为项目中用到的其他模块把AppBaseTheme覆盖了呢?

我们的项目中还有两个本地依赖的库,自己写的,而这两个库中都还有style文件,并且这些style文件恰恰有:

<resources>
    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>
    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>
</resources>

这里的AppBaseTheme覆盖了主模块中的AppBaseTheme,主模块中AppBaseTheme继承自

Theme.AppCompat.Light.NoActionBar

而这里的继承自

Theme.AppCompat.Light.DarkActionBar

因此,总是会报do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false 。。。这样的错误。

但是,为什么会被覆盖呢,难道依赖的库反而有更高优先级?

不是!主项目的优先级是最高的。

如果依赖的库中只有values目录,那么它下面的styles.xml不会覆盖主项目。

而如果依赖的库中有更精准的values目录,比如values-v14,而主项目没有values-v14,则有可能覆盖某些版本的手机。

比如我4.4的手机就是被values-v14给覆盖了。

注:

其中API 11+代表android 3.0 +
其中API 14+代表android 4.0 +

记录在此,加深印象,也希望对别人有用。