以前からAndroidアプリのイマーシブモードとは格闘しているものの、古いプロジェクトを更新しているとAndroid Studioを使うようになった辺りから、システムのユーザーインターフェース(上部ステータスバーと下部ナビゲーションバー)の表示非表示で使うwindow.decorView.systemUiVisibility
が廃止になりますよと言う警告を目にしていたので、未だ最新OS事案はないもののやってくる前に(公式の文書が古いこともあり)対応しました。具体的にはAndroid 12以上に対応する際の onWindowFocusChanged
で呼び出す際に Android Studio 2021.3.1でエラーを吐かない hideSystemUI
関数の書き方になります。
private fun hideSystemUI() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.setDecorFitsSystemWindows(false)
window.insetsController?.apply {
hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
} else {
@Suppress("DEPRECATION")
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN)
}
}
参考: java – Immersive fullscreen on Android 11 – Stack Overflow
コード全体はこちら: Enabling Immersive Mode from JavaScript Event on WebView