2
1

More than 1 year has passed since last update.

はじめに

今回、自分は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関連に色々と調整が入り、今まで設定していたものができなくなっていってしまう中、公式から出されているhideshowは従来の実装とは大幅に変わってしまうものでした。
なので、従来の実装とは変わらずにできる方法を探したところ今回の様な内容になりました。
何かの手助けになれたら幸いです

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1