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
}
}