Android 12 Splash API设备旋转时状态栏下方显示白色背景问题解决方案咨询
解决Android 12 Splash API旋转时状态栏下方白色背景问题
这个问题我之前也碰到过,核心原因是Activity默认窗口背景为白色,加上旋转重建时Fragment加载有短暂延迟,SplashScreen的白色背景和后续页面的蓝色背景衔接出现了空档,就露出了状态栏下方的白色区域。结合你的代码,给你两个针对性的解决方案:
方案一:修改应用主题,统一窗口背景与Fragment颜色
在themes.xml的主应用主题Theme.AAAAccountsKotlin中添加android:windowBackground属性,让Activity的默认背景和Fragment的@color/logo_blue保持一致:
<style name="Theme.AAAAccountsKotlin" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 保留原有属性 --> <item name="colorPrimary">@color/logo_blue</item> <item name="android:statusBarColor" tools:targetApi="l">@color/logo_blue</item> <!-- 添加这一行,设置窗口背景为蓝色 --> <item name="android:windowBackground">@color/logo_blue</item> <!-- 其他自定义属性 --> </style>
这样不管是Activity启动还是旋转重建,在Fragment加载完成前,Activity背景都会是蓝色,不会露出白色,完美衔接Splash和页面的视觉效果。
方案二:优化SplashScreen的显示时机(可选)
如果不想修改全局窗口背景,也可以控制SplashScreen直到Fragment完全加载后再消失。修改MainActivity.kt代码:
@AndroidEntryPoint class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化SplashScreen并设置保持显示的条件 val splashScreen = installSplashScreen() // 监听Fragment加载状态,确保DashboardFragment显示后再隐藏Splash splashScreen.setKeepOnScreenCondition { val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment // 当当前目的地不是DashboardFragment时,保持Splash显示 navHost?.navController?.currentDestination?.id != R.id.dashboardFragment } setContentView(R.layout.activity_main) } }
这个方法会让SplashScreen持续显示,直到你的DashboardFragment完全加载完成,避免中间出现白色背景的空档期。注意不要让条件永远为true,否则Splash会一直停留在界面上。
验证效果
修改完成后,旋转设备时状态栏下方区域会直接显示蓝色(和Fragment背景一致),不会再出现白色背景的问题。
内容的提问来源于stack exchange,提问作者Saify
相关产品推荐
相关产品推荐

