动态更改AppTheme

时间:2018-01-06 15:26:30

标签: android xml themes

目标:我想允许用户更改我的应用的颜色主题。

主题(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”)。
我有三个其他主题FullScreenMainActivitySearchActivity来自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>

现在,只有SignInActiviyMainActivitySearchActivity有自己的主题,其他活动(也是应用)都有AppTheme

我做了什么:我创建了一个BaseActivity类,所有活动都扩展了这个类。在BaseActivity之前的onCreate方法中{ {1}}声明我使用此代码更改颜色主题:

setTheme(R.style.AppTheme_Red);

问题:此代码更改了所有活动的主题,以及需要不同主题的superSignInActiviyMainActivity


我不知道颜色主题是否有用。
我唯一需要的是改变SearchActivity这样的颜色:

AppTheme

那么,我需要做些什么才能改变我应用的颜色?

2 个答案:

答案 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);