一、沉溺式状态栏的完成

该办法用于表示内容是否超出至状态栏和底部导航栏显现,false标明超出。(这也就咱们完成沉溺式后需要做适配的原因)

WindowCompat.setDecorFitsSystemWindows(window, false)

注意:当运用setDecorFitsSystemWindows()时,注意不要运用View.setSystemUiVisibility(),因为在源码中,对于Android4.1-10的手机依旧采用了setSystemUiVisibility()办法完成沉溺式。

Android 沉浸式状态/导航栏的实现以及布局重叠的适配(Kotlin)
设置状态栏透明 window.statusBarColor = Color.TRANSPARENT

二、沉溺式导航栏的完成

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            //当背景透明时去掉灰色蒙层
            window.isNavigationBarContrastEnforced = false
        }
        //导航栏色彩透明
        window.navigationBarColor = Color.TRANSPARENT 

三、处理状态栏UI与布局内容发生的堆叠

完成沉溺式后咱们会发现,布局内容与状态栏、底部导航栏叠加在一起了,为了防止运用UI与体系UI发生堆叠,所以咱们要对其进行偏移。

首先经过这个办法,获取insets。参数填入window.decorView,当然也能够运用坐落完成沉溺式的页面的view,

ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat -> }

那么insets详细是什么呢?实际上insets是描述一组用于窗口内容的插入。说人话便是:咱们能够从insets中获取包括状态栏,导航栏等体系UI的方位间隔,然后用于调整咱们的运用UI的方位。接下来咱们就来看怎么完成

   ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
          val systemWindow=insets.getInsets(WindowInsetsCompat.Type.systemBars() or 
                                      WindowInsetsCompat.Type.displayCutout())
          //为需要偏移的view设置padding
          moveView.setPadding(0,systemWindow.top,0,0)
            insets
        }

经过inset.getInsets()获取对应的体系UI的信息,咱们也能够经过 “or” 同时获取多种体系栏的间隔。例如咱们能够同时获取体系的状态栏和刘海屏高度,假如刘海屏的高度更高则回来的是刘海屏的高度。

因为沉溺式所导致的底部布局与导航栏堆叠问题也一样迎刃而解了。

view.setPadding(0,0,0,systemWindow.bottom)

WindowInsetsCompat.Type参数解释:

WindowInsetsCompat.Type.ime();//键盘

WindowInsetsCompat.Type.displayCutout();//刘海屏

WindowInsetsCompat.Type.statusBars();//状态栏

WindowInsetsCompat.Type.navigationBars();//导航栏

WindowInsetsCompat.Type.captionBar();//标题栏

WindowInsetsCompat.Type.systemBars();//状态栏,导航栏和标题栏

WindowInsetsCompat.Type.systemGestures();//体系手势

WindowInsetsCompat.Type.mandatorySystemGestures();//强制性体系手势

WindowInsetsCompat.Type.tappableElement();//可点击区域

四、其他常见问题

状态栏字体色彩修正:

//状态栏字体改为白色

WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = false

//状态栏字体改为黑色

WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = true

导航栏按钮色彩修正:

WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightNavigationBars= false

用这个办法的时候会导致状态栏字体变成白色,目前我的解决办法是重新再设置一次状态栏字体色彩,假如你有更好的解决办法欢迎在谈论区留言。