You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何用Kotlin永久锁定安卓导航栏

如何用Kotlin永久屏蔽安卓系统导航栏

要实现进入应用后彻底隐藏并锁定系统导航栏,需结合安卓的沉浸式全屏模式、生命周期回调和系统UI变化监听,确保导航栏不会因任何应用内操作或前台切换而重新显示。以下是具体实现方案:

1. 核心锁定逻辑(适配全版本安卓)

创建工具方法,针对不同安卓版本设置对应的系统UI标志和窗口参数,确保导航栏隐藏且难以被唤起:

import android.os.Build
import android.view.View
import android.view.Window
import android.view.WindowInsetsController
import android.view.WindowManager

private fun lockNavigationBar(window: Window) {
    window.decorView.apply {
        // 适配安卓11及以上版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            window.insetsController?.let { controller ->
                // 隐藏导航栏和状态栏
                controller.hide(WindowInsets.Type.navigationBars() or WindowInsets.Type.statusBars())
                // 设置行为:滑动仅短暂显示导航栏,随后自动隐藏(部分设备需结合其他配置强化锁定)
                controller.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            }
        } else {
            // 适配安卓10及以下版本
            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.setFlags(
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )
}

2. 绑定生命周期,确保全程生效

在Activity的关键生命周期回调中调用锁定方法,防止应用从后台返回或重启时导航栏恢复:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lockNavigationBar(window)
    }

    override fun onRestart() {
        super.onRestart()
        lockNavigationBar(window)
    }

    override fun onResume() {
        super.onResume()
        lockNavigationBar(window)
    }

    // 窗口获取焦点时重新锁定,防止某些操作触发导航栏显示
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            lockNavigationBar(window)
        }
    }

    // 安卓10及以下版本,监听系统UI变化,一旦导航栏显示就立即隐藏
    private val systemUiChangeListener = View.OnSystemUiVisibilityChangeListener { visibility ->
        if (visibility and View.SYSTEM_UI_FLAG_HIDE_NAVIGATION == 0) {
            lockNavigationBar(window)
        }
    }

    override fun onStart() {
        super.onStart()
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            window.decorView.setOnSystemUiVisibilityChangeListener(systemUiChangeListener)
        }
    }

    override fun onStop() {
        super.onStop()
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            window.decorView.setOnSystemUiVisibilityChangeListener(null)
        }
    }
}

3. 关键注意事项

  • 系统限制:此方案仅能在应用内部锁定导航栏,用户按Home键返回桌面或切换到其他应用时,导航栏仍会正常显示——这是安卓系统的安全限制,无法突破。
  • 布局适配:由于设置了FLAG_LAYOUT_NO_LIMITS,应用界面会延伸到状态栏和导航栏区域。需给布局添加顶部/底部内边距,或使用android:fitsSystemWindows="true"属性,避免按钮、文本等内容被系统状态栏(或隐藏的导航栏区域)遮挡。
  • 定制ROM兼容:部分品牌的定制安卓系统(如小米、华为)可能有特殊的导航栏逻辑,需在对应设备上测试验证效果。

内容的提问来源于stack exchange,提问作者Luiz Ekstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:40:57