はじめに
今回、自分はStatusBarを透過させた状態でViewをStatusBarに被せて表示をさせる際に、単一Activity複数Fragmentで実装していたため、動的にStatusBarの状態を変更していたところ、被せて表示させていない画面から被せて表示させたい画面に遷移し、その後被せて表示させていない画面に戻ったとき、BottomNavigationのViewが大幅に崩れてしまっていたため、その解決策を備忘録として置いておきます。
実装状態
まず、自分の場合に行っていたStatusBarの透過処理とViewの被せて表示する方法を記述しておきます。
// 画面全体表示設定trueの場合被らず表示、falseの場合被せて表示
WindowCompat.setDecorFitsSystemWindows(window, true)
// StatusBarの文字色を変更trueの場合白、falseの場合グレー
val wic = WindowInsetsControllerCompat(window, window.decorView)
wic.isAppearanceLightStatusBars = true
// 透過させたいのはStatusBarだけなのでNavigationBarは透過させていない
// しかしWindowCompat.setDecorFitsSystemWindows(window, true)は問答無用で全画面表示に適応させるため
// bottomにmarginを入れてあげないとViewが崩れてしまうので、下記の設定によりView崩れを阻止
binding.root.setOnApplyWindowInsetsListener { rootView, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars())
rootView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = insets.bottom
}
WindowInsets.CONSUMED
}
解決方法
さて、ここからが本題です。
最初は、BottomNavigationが崩れてしまうのはsetOnApplyWindowInsetsListener
への設定が残ってしまっているからだと思い、onDestroyView
でマージンを上書きする様にコードを書きましたが、それでもViewは崩れたままでした。
そこで解決策となるのが下記のコードです。
binding.bottomNavigation.setOnApplyWindowInsetsListener(null)
こちらを設定してあげることによりBottomNavigation
にも設定されてしまっていた下部へのマージンを上書きし、View崩れを直すことができました。
最後に
Android30からSystemBar
関連に色々と調整が入り、今まで設定していたものができなくなっていってしまう中、公式から出されているhide
とshow
は従来の実装とは大幅に変わってしまうものでした。
なので、従来の実装とは変わらずにできる方法を探したところ今回の様な内容になりました。
何かの手助けになれたら幸いです