27

我发现我正在启动的一个新应用程序存在一个奇怪的问题。我正在使用新的 Android 12 初始屏幕 API 来创建我的初始屏幕,并按照Google 提供的指南进行操作。我在我的项目中包含了 core-splashscreen,以提供与旧版本 Android 操作系统的兼容性。当我运行该应用程序时,我在 API 30 等旧操作系统版本上看到了预期的启动屏幕,但是当我在 API 31 上运行它时,我提供的启动屏幕图标不显示。显示我指定的背景颜色,但图标根本不存在。我已经尝试过使用可绘制资产和 mipmap 进行此操作,但没有任何效果。我很困惑,因为我发现的每个教程都显示了我遵循的相同步骤以及他们工作启动画面的屏幕截图,但我没有任何运气。

对于上下文,这是我对 v31 的初始屏幕样式定义:

<style name="Theme.Splash" parent="Theme.SplashScreen">
    <item name="android:windowSplashScreenBackground">@color/orange_7A</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_foreground</item>
    <item name="postSplashScreenTheme">@style/Theme.App</item>
</style>

除了我使用“windowSplashScreenAnimatedIcon”而不是“android:windowSplashScreenAnimatedIcon”之外,我对所有其他操作系统版本都有相同的样式。我已经尝试过 v31 在项目名称前面有和没有“android:”的情况,但都不起作用。这是我的 MainActivity.kt:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    installSplashScreen()
    
    setContent {
        MyVeevaTheme {
            Login()
        }
    }
}

我还在我的 AndroidManifest.xml 中将“android:theme”属性设置为我的初始样式。我知道正在应用启动样式,因为它尊重背景颜色,但由于某种原因它没有显示图标,即使图标对于旧操作系统版本显示良好。提前感谢您提供的任何帮助。

4

4 回答 4

27

TL;DR 杀死应用程序并从启动器运行,从 Android Studio 运行时图标不显示。

在此处添加我的评论作为更好可见性的答案。

我确实想出了如何让它显示出来。我正在按照本教程设置一个基础项目来重新创建问题,我注意到作者在底部附近放置的注释提到仅运行应用程序不会显示完整的初始屏幕。您必须杀死它并从启动器中打开应用程序。一旦我这样做了,我就能看到我的启动画面。烦人,但至少我现在有办法测试它。我确实继续并为此记录了一个错误报告,但我现在有一个解决方法。感谢大家的回答/评论!

于 2021-11-03T20:05:29.623 回答
2

从深层链接导航时也不会显示图标。而且它看起来更像只是不显示图标。它还停止调用setOnExitAnimationlambda 的代码。

installSplashScreen().apply {
    setOnAnimationListener { viewProvider ->
    viewProvider.iconView
    .animate()
    .setDuration(500L)
    .alpha(0f)
    .withEndAnimation {
       viewProvider.remove()
       someActionCall() 
    }
    .start()
} 

如果您依赖始终调用此代码,则不是。请参阅问题跟踪器中的提及:https ://issuetracker.google.com/issues/207095799

于 2021-12-07T16:25:27.960 回答
1

根据文档 installSplashScreen() 的人应该在 super.onCreate() 之前调用

于 2022-02-16T18:03:57.447 回答
1

当您使用 AndroidX SplashScreen 库时,就像您正在做的 ( Theme.SplashScreen) 一样,您需要使用不带前缀的windowSplashScreen*属性。android:

前缀用于调用平台属性,但在这种android:情况下,您使用的是库而不是平台,因此不需要前缀:

res/values/themes.xml

<style name="Theme.Splash" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/orange_7A</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/splash_foreground</item>
    <item name="postSplashScreenTheme">@style/Theme.App</item>
</style>
于 2021-11-03T14:31:42.843 回答