Android应用如何完全禁用状态栏与导航栏(防止滑动调出)
嘿,这个问题我之前做全屏沉浸式应用的时候踩过坑!默认的隐藏方法其实只是把系统栏“暂时藏起来”,系统还是留了滑动唤起的交互入口,要彻底禁用得针对不同Android版本用对应的严格全屏模式,下面给你详细说:
核心原理
Android的系统栏隐藏分为不同级别,普通的hide()方法属于“临时隐藏”,系统为了保留用户的操作入口,允许滑动唤起。要完全禁用这个行为,需要启用沉浸式严格模式,让系统栏彻底不响应滑动唤起的操作。
分版本实现方案
Android 11及以上(API 30+)
从API 30开始,Google推出了WindowInsetsController来统一管理窗口Insets,我们可以通过设置systemBarsBehavior为BEHAVIOR_NEVER来彻底禁用滑动唤起:
// 在Activity的onCreate方法中添加 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val windowInsetsController = window.insetsController windowInsetsController?.let { // 隐藏状态栏和导航栏 it.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) // 禁用滑动唤起系统栏的行为 it.systemBarsBehavior = WindowInsetsController.BEHAVIOR_NEVER } } }
Android 10及以下(API 19-29)
对于较旧的版本,我们需要使用systemUiVisibility的组合标志,配合IMMERSIVE标志来实现严格全屏:
// 在Activity的onCreate方法中添加 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE // 隐藏状态栏 or View.SYSTEM_UI_FLAG_FULLSCREEN // 隐藏导航栏 or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // 确保布局稳定,不会因为系统栏显示/隐藏而跳动 or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) // 添加全屏flag,增强隐藏效果 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } }
关键补充:焦点恢复时重新设置
有时候Activity失去焦点(比如弹出对话框后返回),系统栏可能会重新显示,所以我们需要在onWindowFocusChanged方法中重新应用设置,确保全屏状态稳定:
override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { // 重新恢复严格全屏状态 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val controller = window.insetsController controller?.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) controller?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_NEVER } else { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } } }
注意事项
- 部分定制ROM(比如某些国产手机的系统)可能有自己的系统栏交互逻辑,极端情况下可能无法完全禁用滑动唤起,这时候可能需要联系厂商获取特殊权限,但原生Android和主流ROM(如小米、华为、三星的官方系统)都能正常生效。
- 这种严格全屏模式适合游戏、视频播放器等需要完全沉浸式体验的应用,普通应用慎用,避免影响用户的正常操作(比如下拉状态栏看通知)。
- 不需要申请额外权限,所有操作都在Activity内部完成。
内容的提问来源于stack exchange,提问作者Alex D.




