觉得如果是全屏的Dialog,可以直接使用Box在上面覆盖一层,比dialog更好整
不过硬是要整的话,就使用下面的扩展方法吧
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.window.DialogWindowProvider
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
@Composable
fun HideSystemAndNavBarForDialog() {
val view = LocalView.current
LaunchedEffect(Unit) {
val window = (view.parent as DialogWindowProvider).window
WindowCompat.setDecorFitsSystemWindows(window, false)
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = android.graphics.Color.TRANSPARENT
window.navigationBarColor = android.graphics.Color.TRANSPARENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
// 同时隐藏状态栏和导航栏(Compat,适配性更好)
WindowCompat.getInsetsController(window, window.decorView)?.apply {
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
hide(WindowInsetsCompat.Type.systemBars()) // 等同于 statusBars() | navigationBars()
}
// 旧版兜底(部分三星机型需要)
@Suppress("DEPRECATION")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_FULLSCREEN or
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
}
}
}
使用示例:
Dialog(onDismissRequest = {
//禁止点击空白处关闭
}, properties = DialogProperties(
usePlatformDefaultWidth = false,
decorFitsSystemWindows = false
)) {
HideSystemAndNavBarForDialog()
DialogContent()
}
)
评论区