You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android应用如何完全禁用状态栏与导航栏(防止滑动调出)

嘿,这个问题我之前做全屏沉浸式应用的时候踩过坑!默认的隐藏方法其实只是把系统栏“暂时藏起来”,系统还是留了滑动唤起的交互入口,要彻底禁用得针对不同Android版本用对应的严格全屏模式,下面给你详细说:

核心原理

Android的系统栏隐藏分为不同级别,普通的hide()方法属于“临时隐藏”,系统为了保留用户的操作入口,允许滑动唤起。要完全禁用这个行为,需要启用沉浸式严格模式,让系统栏彻底不响应滑动唤起的操作。

分版本实现方案

Android 11及以上(API 30+)

从API 30开始,Google推出了WindowInsetsController来统一管理窗口Insets,我们可以通过设置systemBarsBehaviorBEHAVIOR_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.

火山引擎 最新活动