使用DayNight主题时更改启动屏幕的背景颜色

29

我正在使用带有启动画面的DayNight主题。

启动画面是一个具有白色背景的层列表。

因此,当是白天时,白色的启动画面显示,接着是白色的活动。但在夜晚,白色的启动画面显示,接着是黑暗的活动。

如何根据主题更改启动画面的背景颜色。

不能使用自定义颜色属性,因为只有DayNight主题。

themes.xml

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:colorControlNormal">@color/colorAccent</item>
</style>

<style name="LaunchTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/launch_screen</item>
</style>

启动画面界面文件 launch_screen.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <color android:color="@color/material_white"/>
</item>
<item>
    <bitmap
       android:gravity="center"
       android:src="@drawable/launch_logo"
       android:tileMode="disabled"/>
</item>

:这是一个HTML标记,表示一段文本或内容的开始和结束。我不能翻译这个标记本身,只能告诉你它的作用。

2
阅读此内容,您将了解一些想法:http://blog.nkdroidsolutions.com/android-daynight-theme-example-using-appcompat-v23-2/ - Harshad Pansuriya
1
非常感谢提供的链接。我之前不知道有drawable-night和values-night文件夹,这很有用 :) - Amit Jayant
1
很不幸,夜间限定符无法与启动屏幕一起使用。因为启动屏幕是由操作系统加载的,而不是应用程序。 :( - Amit Jayant
1
是的,但如果您在“样式”中更改android:windowBackground,则可以成功更改闪屏背景。问题在于,在启动之前不会更改“DayNight”模式。由于这是一种动态的东西(可以根据偏好更改),因此需要注意。 - Ioane Sharvadze
你找到任何解决方案了吗? - Eren Tüfekçi
2个回答

11

除了默认启动主题外,还需在适当的资源目录中提供其夜间变体。

res/values-night/themes.xml

<style name="LaunchTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/launch_screen_night</item>
</style>

res/drawable/launch_screen_night.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <color android:color="@color/material_black"/>
</item>
<item>
    <bitmap
       android:gravity="center"
       android:src="@drawable/launch_logo"
       android:tileMode="disabled"/>
</item>

3
尝试了这个解决方案,但在我的情况下,我仍然无法在启动画面上获得所需的模式背景颜色。正如这里所解释的(https://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/),Android使用Zygote技巧显示预览窗口。而此窗口的背景颜色是由默认应用程序主题设置的,在Manifest文件中为Application指定。 - Rafael
2
应用程序在首次启动时无法加载夜间主题,需要1-2秒钟的时间。 - Ahamadullah Saikat
1
是的,这只有在您拥有特殊的启动活动并且它可以快速启动(Application类中没有重代码)时才有效。在Android 10上,“日/夜主题预览”应该像本地夜间模式设置为“跟随系统”一样工作。 - Eugen Pechanec

5

检查了一段时间后,我找到了答案。

由于启动画面配置是由系统加载的,因此您需要影响系统UI模式。

getSystemService<UiModeManager>()?.nightMode = UiModeManager.MODE_NIGHT_YES

但不幸的是,这不是一个完美的解决方案,因为它会影响系统设置。

夜间模式的更改将全局生效,并将导致所有正在运行的应用程序应用配置更改(可能会触发Activity生命周期事件)。有兴趣实现应用程序本地夜间模式的开发人员应考虑使用AppCompatDelegate.setDefaultNightMode(int)在本地管理夜晚的限定符。


好吧,我想对于我来说不再有启动画面了。 - lasec0203

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接