【问题标题】:Change AppTheme dynamically动态更改 AppTheme
【发布时间】:2018-01-06 15:26:29
【问题描述】:

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

主题 (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 作为默认颜色(“靛蓝”)。
我还有其他三个主题 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 类,所有活动都扩展了这个类。
BaseActivityonCreate 方法中super 声明之前我使用此代码更改颜色主题:

setTheme(R.style.AppTheme_Red);

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


我不知道颜色主题是否有用。
我唯一想要的就是像这样更改 AppTheme 颜色:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <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>

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

那么,我必须做些什么来改变我的应用的颜色?

【问题讨论】:

    标签: android xml themes


    【解决方案1】:

    我通过更改 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);

    【讨论】:

      【解决方案2】:

      引用了评论

      我以红色为例回答

      如果您只想更改 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>
      

      因此,如果您希望状态栏透明,您可以设置第二个主题或第一个主题。


      据我了解,您希望保留默认的“靛蓝”颜色 SignInActivityMainActivitySearchActivity

      Todo 使用 AppTheme 继承这些活动的相关主题

      <style name="AppTheme.SearchActivity" parent="AppTheme">
          ...
      </style>
      

      【讨论】:

      • 不,我解释得不好。例如 MainActivityAppTheme.MainActivity,它只有状态栏颜色“透明”,但如果我设置 AppTheme.Red,状态栏将是红色的......我怎样才能让它透明?跨度>
      • 为了更简单,我只需要把AppTheme的colorPrimary改成@color/redColorPrimary,ecc。我不知道颜色主题是否有用....
      • @Broge 有一个解决方案,但可能并不理想。我会更新答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2023-03-09
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多