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

如何实现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延迟隐藏:

    1. 重写onWindowInsetsChanged方法监听系统栏状态变化
    2. 检测到系统栏显示时启动延迟任务,若期间无导航按钮点击事件,则重新隐藏系统栏

    示例代码片段:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:18:17