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
相关产品推荐
相关产品推荐

