启用深色主题时,windowBackground 不会在样式中选择夜间颜色

Posted

技术标签:

【中文标题】启用深色主题时,windowBackground 不会在样式中选择夜间颜色【英文标题】:windowBackground not picking night color in styles when dark theme enabled 【发布时间】:2021-03-14 03:12:44 【问题描述】:

我已经在我的 android 应用程序中实现了深色 ui,一切正常,但我有一个启动器活动,其中 windowBackground 采用这样的样式

   <style name="AppTheme.Launcher" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="android:windowBackground">@drawable/l_launch_screen</item>
    </style>

l_launch_screen 就是这个

<?xml version="1.0" encoding="utf-8"?>

<!-- The android:opacity=”opaque” line — this is critical in preventing a flash of black as your theme transitions. -->
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <!-- The background color, preferably the same as your normal theme -->
    <item android:drawable="@color/colorPrimaryDark"/>

    <!-- Your product logo - 144dp color version of your app icon -->
    <item>
        <bitmap
            android:src="@drawable/app_round_icon"
            android:gravity="center"/>
    </item>

</layer-list>

在这个colorPrimaryDark 有两种颜色,一种是夜晚,另一种是简单 现在的问题是,当android通过在android q通知面板中选择Dark theme激活深色主题时,android:windowBackground正在选择夜间颜色,但是当Dark theme被android禁用并且通过设置在我的应用程序中选择了深色主题时在应用类中

   AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

android:windowBackground 没有选择夜间颜色,但所有其他活动都在完美选择夜间颜色我已经看到与 WhatsApp 应用程序相同的行为所以这是一个错误还是我做错了什么我也尝试定义不同夜间样式和可绘制样式,但发生同样的问题

【问题讨论】:

你已经告诉它不管主题使用什么颜色:@color/colorPrimaryDark @PrinceAli colorPrimaryDark 有两种颜色,一种是夜色,一种是底色 那你不能用@color ,怎么把背景应用到其他屏幕上? 我将 android:windowBackground 用于我的启动器活动,而不用于其他活动 发布您的日夜主题风格。如果可能的话,一些 xml 代码,你也可以将颜色更改为一些背景 【参考方案1】:

这是使用活动方法实现加载屏幕的方法。

    添加 2 个新资源文件:
对于浅色主题splash_background.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@color/white" />
    <item>
        <bitmap android:gravity="center"
            android:src="@drawable/logo"/>
    </item>
</layer-list>
对于深色主题 splash_background.xml(同名)将其放在 drawable-night 文件夹中(如果没有则创建)并且您必须添加到 colors.xml 自定义深色(例如&lt;color name="black_700"&gt;#191414&lt;/color&gt;):
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@color/your_dark_background_color" />
    <item>
        <bitmap android:gravity="center"
            android:src="@drawable/logo"/>
    </item>
</layer-list>
    终于在你的themes.xml中:
    <style name="Theme.AppName.SplashTheme" parent="Theme.AppName">
        <item name="android:windowBackground">@drawable/splash_background</item>
    </style>
    将启动画面创建为现有样式的主题并在应用启动时显示的好方法:为此创建新的 Activity
class SplashScreenActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        setTheme(R.style.Theme_AppName_SplashTheme)
        super.onCreate(savedInstanceState)

        startActivity(Intent(this,MainActivity::class.java))
        overridePendingTransition(0, 0) //this one to remove animation
        finish()
    

    AndroidManifest.xml 中的 SplashScreenActivity 上应用此主题:
        <activity
            android:name=".SplashScreenActivity"
            android:excludeFromRecents="true"
            android:exported="true"
            android:launchMode="singleInstance"
            android:theme="@style/Theme.AppName.SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
            </intent-filter>
        </activity> 
    在 MainActivity.kt 中,您必须添加 Intent.FLAG_ACTIVITY_NO_ANIMATION 以消除切换活动时烦人的滑动动画:
    companion object 
        fun startFrom(context: Context) 
            val intent = Intent(context, MainActivity::class.java)
            intent.flags =
                Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NO_ANIMATION 
            context.startActivity(intent)
        
    

【讨论】:

以上是关于启用深色主题时,windowBackground 不会在样式中选择夜间颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vuetify 的浅色主题中启用具有自定义颜色的深色模式?

如何在带有深色主题的android上更改chrome中状态栏的颜色?

在 Ionic 中禁用黑暗主题

视觉辅助 x 深色主题

如何在 YouTrack 中设置深色主题

Flutter web 在带有深色主题的 Android 浏览器中的颜色错误