在一个包含库项目的android项目中,我需要在清单中为主应用程序和库设置不同的主题。就像我需要在主项目中设置以下主题
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/grey</item>
<item name="colorPrimaryDark">@color/black</item>
<item name="colorAccent">@color/green</item>
</style>
以及下面的库项目
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/blue</item>
<item name="colorPrimaryDark">@color/red</item>
<item name="colorAccent">@color/white</item>
</style>
主要应用程序样式会覆盖库项目样式。 当我为样式指定不同的名称时,它会引发明显的合并冲突错误。
以下是主要应用
的清单<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
这个是图书馆
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
答案 0 :(得分:8)
构建应用程序后,gradle会将您的清单文件合并为一个,因此将库中的application
标记设置主题将被应用程序的属性覆盖。
将您的样式名称更改为其他名称
<style name="MyLibTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/blue</item>
<item name="colorPrimaryDark">@color/red</item>
<item name="colorAccent">@color/white</item>
</style>
如果要在库函数中启动某些活动,则在库清单文件中单独将主题设置为活动。在项目构建后,在库清单上的application
标记上设置的项目将被替换,因此设置个人活动的主题
<activity android:name=".MyLibActivity" android:theme="@style/MyLibTheme">
</activity>
或者您可以在活动代码中使用setTheme。
setTheme(R.style.MyLibTheme);
在构建过程中,如果用户(库用户)使用相同的主题名称,它将替换为主app
模块主题,为了保护这种情况,您可以在库的gradle文件中使用gradle选项。
android{
// replace mylib_ with name related to your library
resourcePrefix 'mylib_'
}
答案 1 :(得分:0)
我认为您可能想在主项目清单的应用程序节点下使用tools:replace="android:theme"
。您可以在这里找到详细信息:https://developer.android.com/studio/build/manifest-merge