我已经知道了使用Accompanist库来更改导航栏和状态栏颜色的方法。目标是完全隐藏它们。
SystemUiController
具有用于系统栏可见性的getter/setter方法:
val systemUiController: SystemUiController = rememberSystemUiController()
systemUiController.isStatusBarVisible = false // Status bar
systemUiController.isNavigationBarVisible = false // Navigation bar
systemUiController.isSystemBarsVisible = false // Status & Navigation bars
@Composable
fun HideSystemBars() {
val context = LocalContext.current
DisposableEffect(Unit) {
val window = context.findActivity()?.window ?: return@DisposableEffect onDispose {}
val insetsController = WindowCompat.getInsetsController(window, window.decorView)
insetsController.apply {
hide(WindowInsetsCompat.Type.statusBars())
hide(WindowInsetsCompat.Type.navigationBars())
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
onDispose {
insetsController.apply {
show(WindowInsetsCompat.Type.statusBars())
show(WindowInsetsCompat.Type.navigationBars())
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_DEFAULT
}
}
}
}
fun Context.findActivity(): Activity? {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
return null
}
val insetsController = WindowCompat.getInsetsController(window, window.decorView)
insetsController.apply {
hide(WindowInsetsCompat.Type.statusBars())
hide(WindowInsetsCompat.Type.navigationBars())
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
DisposableEffect(key1 = true){
systemUiController.isStatusBarVisible = false // Status bar
onDispose {
systemUiController.isStatusBarVisible = true // Status bar
}
}
implementation("com.google.accompanist:accompanist-systemuicontroller:0.31.2-alpha")
你可以在你的MainActivity中直接这样做
override fun onResume() {
super.onResume()
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
}
override fun onStart() {
super.onStart()
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
}
SystemUiController
库并不是 Compose 的一部分,它最终只是一个使用 WindowInsert
或 DecorView.systemUiVisibility
的包装器。 - Jeffrey Blattman还要添加LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
来隐藏刘海屏
val window = (view.context as Activity).window
val layoutParams = window.attributes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
window.attributes = layoutParams
添加可组合性,以便添加填充,最好在 TopAppBar
中。
modifier = Modifier.windowInsetsPadding(WindowInsets.displayCutout)