如何实现Android导航栏唤起后无操作自动隐藏?
导航栏唤起后自动隐藏的实现方案
系统原生实现(优先推荐)
你之前的代码仅单纯隐藏系统栏,未配置系统栏的交互行为。Android原生提供了对应的行为控制能力,通过WindowInsetsControllerCompat的systemBarsBehavior属性即可实现唤起后自动隐藏的效果:
设置BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE后,用户上滑唤起的系统栏会在无操作时自动隐藏,完全不需要自定义定时器。完整代码示例:
val insetsController = WindowInsetsControllerCompat(window, window.decorView) // 配置系统栏行为:滑动唤起后短暂显示,无操作自动隐藏 insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // 隐藏系统导航栏和状态栏 insetsController.hide(WindowInsetsCompat.Type.systemBars())该方案是系统原生支持的,适配三星S22这类搭载One UI的设备,无需额外编写定时器逻辑。
特殊场景下的替代方案
若三星One UI对原生行为有定制导致不生效,可监听系统栏显示状态,通过Handler延迟隐藏:- 重写
onWindowInsetsChanged方法监听系统栏状态变化 - 检测到系统栏显示时启动延迟任务,若期间无导航按钮点击事件,则重新隐藏系统栏
示例代码片段:
private val hideRunnable = Runnable { WindowInsetsControllerCompat(window, window.decorView).hide(WindowInsetsCompat.Type.systemBars()) } private val handler = Handler(Looper.getMainLooper()) override fun onWindowInsetsChanged(insets: WindowInsets) { super.onWindowInsetsChanged(insets) val isSystemBarsVisible = insets.isVisible(WindowInsetsCompat.Type.systemBars()) if (isSystemBarsVisible) { // 5秒后自动隐藏,可按需调整时长 handler.postDelayed(hideRunnable, 5000) } else { handler.removeCallbacks(hideRunnable) } } // Activity销毁时移除任务,避免内存泄漏 override fun onDestroy() { super.onDestroy() handler.removeCallbacks(hideRunnable) }不过这种属于自定义实现,优先推荐使用原生行为配置。
- 重写
内容的提问来源于stack exchange,提问作者Bungles
相关产品推荐
相关产品推荐

