執筆日時 2020/12/31
更新: 2021/11/11
新しいWindowInsetsController
ActivityのonResumeで以下の処理を行います。
window.insetsController?.hide( WindowInsets.Type.statusBars() .or(WindowInsets.Type.navigationBars()) ) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// 2021/11/11更新 カットアウトに対応 WindowCompat.setDecorFitsSystemWindows(window, false) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES }
以前の処理
以上の処理はAndroid Rだけで行えますので、以前のバージョンでは分岐を行い、個別に処理を書く必要があります。例えば以下のような。
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
Compatあるよ
AndroidX.core
にバージョンの分岐の処理を気にしなくて良い Compat
である WindowInsetsControllerCompat
が存在するのでそれを使用しない手はありません。
Core | Android Developers
ただし 1.5.0-alpha05
からの機能になります。
Backported the #hide() and #show() methods from WindowInsetsController APIs, added in API 30 (I21573)
https://developer.android.com/jetpack/androidx/releases/core#core_and_core-ktx_version_150_2
1.4.0もまだalphaですがね。
WindowInsetsControllerCompatを使用した処理
WindowInsetsControllerCompat(window, binding.root).also { controller ->
controller.hide(
WindowInsetsCompat.Type.statusBars()
.or(WindowInsetsCompat.Type.navigationBars())
)
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
おわりに
こんな分岐処理書いていられないですからね。