アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Android R(30)】全画面表示の方法【Compatあるよ】

執筆日時 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ですがね。
f:id:matsudamper:20201231090130p:plain:w200

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
}

おわりに

こんな分岐処理書いていられないですからね。
f:id:matsudamper:20201231085953p:plain:w400