【问题标题】:Android 12 splash white backgroundAndroid 12 飞溅白色背景
【发布时间】:2021-09-10 10:44:06
【问题描述】:

我试图添加对 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。

App flow -> 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 的主题中添加 &lt;item name="android:windowBackground"&gt;@color/android:black&lt;/item&gt; 时,我得到的不是白屏,而是黑屏。

【问题讨论】:

  • 您是否看到分配给启动画面的颜色?如果是,并且之后出现白色闪烁,则您可能有另一个活动开始,或者您可能设置了另一个主题。如果您也分享您的 Activity 代码会有所帮助。
  • 是的,如果我将 windowsBackground 设置为上述样式,那么我可以看到该颜色而不是白色。在此之前我也可以看到启动背景和图标。流程是这样的 - SplashActivity(带有提到的主题)然后我暂停 preDraw 方法并导航到另一个活动。
  • 我的猜测是白色闪烁你的第二个活动的窗口背景
  • 不,这不可能是因为当我将 windowsBackground 作为黑色添加到 SplashActivity 的主题时,它会替换白色背景。
  • 您说您导航到第二个活动。我认为第二个活动具有白色背景,除非您还为第二个活动设置相同的主题。也许粘贴您的 manifest.xml 和活动的代码来帮助我们找到问题。

标签: android splash-screen beta android-12


【解决方案1】:

问题是您在请求导航到其他活动后返回true 并删除OnPreDrawListener,这向系统表明您当前的活动现在可以绘制,但下一个活动还没有可见,因此您看到的闪光。

总是在预绘制监听器中返回 false 并在 onStop() 中删除它

【讨论】:

  • 可以更新一下官方文档吗?它要求我们在视图模型准备好后移除监听器,然后返回 false。那会奏效吗?因为我们已经移除了监听器,然后将 false/true 传递给它。
  • 文档在您不导航到其他活动时有效。导航到另一个活动时没有单一的方法来处理启动屏幕,理想情况下,这不应该发生以减少启动时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多