Android(Kotlin)开发中如何移除应用底部的灰色半透明背景?
Android(Kotlin)开发中如何移除应用底部的灰色半透明背景?
兄弟,我懂你刚学Kotlin做Todo应用想搞全屏的心情!既然已经搞定顶部状态栏了,那底部那层半透明的灰色背景,其实就是系统导航栏没完全处理好导致的,给你几个亲测有效的实操方法,都是我之前踩坑总结的:
一、Android 11+ 推荐用新的WindowInsetsController方法(更规范)
这是官方现在主推的方式,代码清晰还不容易出问题:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 关键:让布局内容延伸到系统栏的区域,不再给系统栏留单独空间 window.setDecorFitsSystemWindows(false) val controller = window.insetsController if (controller != null) { // 同时隐藏顶部状态栏和底部导航栏 controller.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) // 设置导航栏隐藏后,用户滑动屏幕边缘会临时显示,松手后自动隐藏(按需开启,不想让用户唤起就去掉这行) controller.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // 彻底去掉导航栏的半透明灰色背景,设为完全透明 window.navigationBarColor = Color.TRANSPARENT } }
这里setDecorFitsSystemWindows(false)是核心,它会让你的布局直接占满整个屏幕,再配合导航栏透明+隐藏,半灰色背景自然就没了。
二、适配Android 10及以下的兼容方案
如果你的应用需要覆盖旧版本系统,就用这套旧的系统UI可见性标记方法:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 组合标记实现全屏+沉浸式隐藏导航栏 window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) // 把导航栏和状态栏都设为透明,干掉半灰背景 window.navigationBarColor = Color.TRANSPARENT window.statusBarColor = Color.TRANSPARENT }
SYSTEM_UI_FLAG_IMMERSIVE_STICKY的作用和新方法里的行为一致,都是让导航栏临时唤起后自动隐藏,避免一直占着屏幕空间。
三、如果用Jetpack Compose开发的话
要是你的Todo应用是用Compose写的,操作更简单:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 同样先关闭系统栏的自动适配,让布局延伸全屏 WindowCompat.setDecorFitsSystemWindows(window, false) setContent { TodoAppTheme { // 你的Compose布局,比如用fillMaxSize占满屏幕 Box(modifier = Modifier.fillMaxSize()) { // ... 这里放你的Todo列表和其他控件 } } } }
要是担心临时唤起导航栏时挡住内容,还可以给布局加个导航栏内边距的适配:
Box( modifier = Modifier .fillMaxSize() .padding(WindowInsets.navigationBars.asPaddingValues()) ) { // 布局内容 }
最后提个小建议:最好用真实设备测试,模拟器有时候会有显示偏差,确保效果符合预期~
内容来源于stack exchange
相关产品推荐
相关产品推荐

