深色材质主题无法正确应用

时间:2020-01-12 11:06:29

标签: android material-design

我的应用中有如下四个主题

  • Theme.AppName:每个主题都继承自的主题
  • Theme.AppTheme.Launcher:显示启动器屏幕,直到活动开始 创建,设置应用于清单
  • Theme.AppName.Green
  • Theme.AppName.Dark

AndroidManifest.xml

<application
        ...
        android:theme="@style/Theme.AppName.Green"
        ...>
        <activity
            ...
            android:theme="@style/Theme.AppName.Launcher"
            ...
            >
            ...
        </activity>
        ...
</application>

values/themes.xml

<!-- Base theme -->
<style name="Theme.AppName" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- System / Platform attributes -->
    <item name="android:windowBackground">?android:colorBackground</item>


    <item name="colorPrimaryDark">?colorPrimaryVariant</item>
    <item name="colorAccent">?colorSecondary</item>
</style>

<!-- Launcher theme -->
<style name="Theme.AppName.Launcher" parent="Theme.AppName">
    <item name="android:windowBackground">@drawable/splash_background</item>
    <item name="colorPrimaryDark">@color/app_green_500</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:statusBarColor">@color/app_green_700</item>
</style>

<!-- Green theme. -->
<style name="Theme.AppName.Green" parent="Theme.MaterialComponents.DayNight.NoActionBar">

    <!-- Colors -->
    <item name="colorPrimary">@color/app_green_500</item>
    <item name="colorPrimaryVariant">@color/app_green_700</item>

    <item name="colorSecondary">@color/app_amber_500</item>
    <item name="colorSecondaryVariant">@color/app_amber_700</item>

    <item name="android:colorBackground">@color/app_white</item>
    <item name="colorSurface">@color/app_white</item>
    <item name="colorError">@color/app_error</item>

    <item name="colorOnPrimary">@color/app_white</item>
    <item name="colorOnSecondary">@color/app_white</item>
    <item name="colorOnBackground">@color/app_black</item>
    <item name="colorOnSurface">@color/app_black</item>
    <item name="colorOnError">@color/app_white</item>

    <item name="android:statusBarColor">@color/app_green_700</item>
    ...
</style>

values-night/themes.xml

<style name="Theme.AppName.Dark" parent="Theme.AppName">

    <!--  Colors -->
    <item name="colorPrimary">@color/app_green_200</item>
    <item name="colorPrimaryVariant">@color/app_green_700</item>
    <item name="colorSecondary">@color/app_amber_200</item>

    <item name="colorSurface">@color/app_black_grey</item>
    <item name="android:colorBackground">@color/app_black_grey</item>
    <item name="android:windowBackground">@color/app_black_grey</item>
 </style>

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {

    // reset to Green theme after using the Launcher theme
    setTheme(R.style.Theme_AppName_Green)
    ...
}

面临的问题:

API级别23 中,当我执行以下操作

// in MainActivity onCreate 
// setTheme(R.style.Theme_AppName_Green)
setTheme(R.style.Theme_AppName_Dark)
  • 启动器主题窗口背景显示在背景中
  • FAB颜色是默认的dark mode colorSecondary
  • 底部导航为白色
  • 底部导航选择的项目颜色为默认的深色模式primaryColor

如果我改为关注

// in MainActivity onCreate
// setTheme(R.style.Theme_AppName_Green)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
  • 启动器主题窗口背景仍然显示
  • FAB颜色是默认的dark mode colorSecondary
  • 底部导航为黑色(可以)
  • 底部导航选择的项目颜色为默认的深色模式primaryColor

API级别29

设置系统范围的黑暗模式

  • 除文本颜色为白色外,所有颜色均与绿色主题相同。

如果我强迫使用以下深色主题

// in MainActivity onCreate
// setTheme(R.style.Theme_AppName_Green)
setTheme(R.style.Theme_AppName_Dark)

深色主题按预期出现。


所以我要实现的是

  • 当API级别低于29时,我希望允许用户将应用程序主题更改为深色主题。
  • 在API级别29上,我希望应用在系统级别设置了深色主题时使用深色主题。

我尝试了不同的方法,但是无法按照我的意愿进行操作,请帮忙

0 个答案:

没有答案