目标:我想允许用户更改我的应用的颜色主题。
主题(styles.xml):
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/indigoColorPrimary</item>
<item name="colorPrimaryDark">@color/indigoColorPrimaryDark</item>
<item name="colorAccent">@color/indigoColorAccent</item>
<item name="android:statusBarColor">@color/indigoColorPrimaryDark</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.FullScreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<style name="AppTheme.MainActivity">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
<style name="AppTheme.SearchActivity">
<item name="android:statusBarColor">@android:color/darker_gray</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
<!-- Colors -->
<style name="AppTheme.Indigo">
<item name="colorPrimary">@color/indigoColorPrimary</item>
<item name="colorPrimaryDark">@color/indigoColorPrimaryDark</item>
<item name="colorAccent">@color/indigoColorAccent</item>
<item name="android:statusBarColor">@color/indigoColorPrimaryDark</item>
</style>
<style name="AppTheme.Blue">
<item name="colorPrimary">@color/blueColorPrimary</item>
<item name="colorPrimaryDark">@color/blueColorPrimaryDark</item>
<item name="colorAccent">@color/blueColorAccent</item>
<item name="android:statusBarColor">@color/blueColorPrimaryDark</item>
</style>
<style name="AppTheme.Red">
<item name="colorPrimary">@color/redColorPrimary</item>
<item name="colorPrimaryDark">@color/redColorPrimaryDark</item>
<item name="colorAccent">@color/redColorAccent</item>
<item name="android:statusBarColor">@color/redColorPrimaryDark</item>
</style>
<!-- some other colors -->
</resources>
如您所见,我将主题AppTheme
作为默认颜色(“indigo”)。
我有三个其他主题FullScreen
,MainActivity
和SearchActivity
来自AppTheme
,然后是颜色主题。
AndroidManifest :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.superbstudios.reportnote">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".SignInActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.FullScreen" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SearchActivity"
android:label=""
android:theme="@style/AppTheme.SearchActivity"
android:windowSoftInputMode="stateVisible" />
<activity
android:name=".SettingsActivity"
android:label="@string/title_activity_settings"
android:theme="@style/AppTheme" />
<activity
android:name=".GuideActivity"
android:label="@string/title_activity_guide"
android:theme="@style/AppTheme" />
</application>
</manifest>
现在,只有SignInActiviy
,MainActivity
和SearchActivity
有自己的主题,其他活动(也是应用)都有AppTheme
。
我做了什么:我创建了一个BaseActivity
类,所有活动都扩展了这个类。在BaseActivity
之前的onCreate
方法中{ {1}}声明我使用此代码更改颜色主题:
setTheme(R.style.AppTheme_Red);
问题:此代码更改了所有活动的主题,以及需要不同主题的super
,SignInActiviy
和MainActivity
。
我不知道颜色主题是否有用。
我唯一需要的是改变SearchActivity
这样的颜色:
AppTheme
那么,我需要做些什么才能改变我应用的颜色?
答案 0 :(得分:0)
参考评论
我以红色为例回答
如果您只想更改colorPrimary,请仅保留它。
<style name="AppTheme.Red">
<item name="colorPrimary">@color/redColorPrimary</item>
</style>
其他明智地为红色创建两个主题。一个具有状态栏颜色,另一个继承具有透明状态栏。
<style name="AppTheme.Red">
<item name="colorPrimary">@color/redColorPrimary</item>
<item name="colorPrimaryDark">@color/redColorPrimaryDark</item>
<item name="colorAccent">@color/redColorAccent</item>
<item name="android:statusBarColor">@color/redColorPrimaryDark</item>
</style>
<style name="AppTheme.RedTransparentStatus" parent="AppTheme.Red>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
因此,如果您希望状态栏变为透明,则可以设置第二个主题,或者设置第一个主题。
根据我的理解,你想保留默认&#34; Indigo&#34;颜色为 SignInActivity , MainActivity , SearchActivity 。
Todo所以用AppTheme
继承了这些活动的相关主题<style name="AppTheme.SearchActivity" parent="AppTheme">
...
</style>
答案 1 :(得分:0)
我通过更改styles.xml
解决了这个问题<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/indigoColorPrimary</item>
<item name="colorPrimaryDark">@color/indigoColorPrimaryDark</item>
<item name="colorAccent">@color/indigoColorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.FullScreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<style name="AppTheme.MainActivity">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
<style name="AppTheme.SearchActivity">
<item name="android:statusBarColor">@android:color/darker_gray</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
<!-- Colors -->
<style name="Indigo">
<item name="colorPrimary">@color/indigoColorPrimary</item>
<item name="colorPrimaryDark">@color/indigoColorPrimaryDark</item>
<item name="colorAccent">@color/indigoColorAccent</item>
</style>
<style name="Blue">
<item name="colorPrimary">@color/blueColorPrimary</item>
<item name="colorPrimaryDark">@color/blueColorPrimaryDark</item>
<item name="colorAccent">@color/blueColorAccent</item>
</style>
<style name="Red">
<item name="colorPrimary">@color/redColorPrimary</item>
<item name="colorPrimaryDark">@color/redColorPrimaryDark</item>
<item name="colorAccent">@color/redColorAccent</item>
</style>
</resources>
在我的BaseActivity中,我使用此代码:
getTheme().applyStyle(R.style.Blue, true);