Android 实现沉浸式(Kotlin)

1,500 阅读1分钟

Android 实现沉浸式,由于在Android 11 后,setSystemUiVisibility() 已经备注为不推荐/废弃的API了,同时提供了新的方式 WindowInsetsController ,所以这里做了一下兼容。

在这里记录一下,方便以后忘了,可以炒冷饭。

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
        return
    
    if (hasFocus) {
        val window = this.window
        val decorView = window.decorView
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
            window.insetsController?.also {
                it.hide(WindowInsets.Type.statusBars())
                it.hide(WindowInsets.Type.navigationBars())
            }
        }else{
            decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
        }
    }
}

在看Google Sample的时候发现了另外一种实现方式:

//先决条件 androidx 环境 core版本要在1.5.0以及以上
implementation 'androidx.core:core-ktx:1.5.0'
override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        hideSystemUI()
}

private fun hideSystemUI() {
    WindowCompat.setDecorFitsSystemWindows(window, false)
    WindowInsetsControllerCompat(window, view/*这里要填入一个view,根据布局适当的填一个view进来,我这里填布局的根view*/).let { controller ->
        controller.hide(WindowInsetsCompat.Type.systemBars())
        controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
}