Android 12 飞溅白色背景

问题描述

我试图添加对 Android 12 启动画面的支持。 这是我的v31/styles.xml

<resources>

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item>
    <item name="android:windowSplashScreenIconBackgroundColor">#FF3044</item>
    <item name="android:windowSplashScreenBackground">#FF3044</item>
</style>

</resources>

在新的启动后,我可以看到一个白色的屏幕。那个白屏是 android:windowBackground 但如果我试图将它设置为 @null,我会在白屏的地方得到倒置的飞溅。 飞溅后如何去除白色背景?我猜 Splash API 旨在取代 windowBackground。

应用流程 -> SplashActivity(具有上述主题),然后我使用 viewmodel 暂停 preDraw 方法,然后导航到另一个活动。

SplashActivity.kt - onCreate()

val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                return if (viewmodel.appInit()) {
                    navigatetoHome()
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    false
                }
            }
        }
    )

HomeActivity 没有任何主题。当我在 Splash 的主题添加 <item name="android:windowBackground">@color/android:black</item> 时,不是白色屏幕,而是黑色屏幕。

解决方法

问题是您在请求导航到其他 Activity 后返回 true 并删除 OnPreDrawListener,这向系统表明您当前的 Activity 现在已准备好绘制,但下一个一个尚不可见,因此是您看到的闪光。

只需始终在预绘制侦听器中返回 false 并在 onStop() 中将其删除

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...