687 Words
⚠️

問題があったレイアウト例

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appbar_layout"
            app:elevation="0dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                app:layout_scrollFlags="enterAlways|scroll"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

    </com.google.android.material.appbar.AppBarLayout>

    <!-- メインコンテンツを表示するための領域 -->
    <FrameLayout
            android:id="@+id/main_contents_layout"
            app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <!-- メインコンテンツのアイテムを選択したら遷移する追加画面の領域 -->
    <FrameLayout
            android:id="@+id/additional_content_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

main_contents_layoutは中身にリストをもつFragmentを表示して、そのスクロールに伴ってツールバーが出たり消えたりする。

additional_contents_layoutは最初は何も表示されていないが、main_contents_layoutのFragment内でたとえばリストの項目を選択したときなどに追加で表示する。
ちなみにこれはツールバーを含む画面全体に被さるように表示したいので、app:layout_behaviorは設定していない。

さて、このような条件下でadditional_contents_layoutにFragment(※以下AdditionalFragmentとでもしておく)を表示すると、AdditionalFragment内に配置したRecyclerViewのスクロールにも連動してツールバーが出たり消えたりしてしまい、
つまりAdditionalFragmentの開始前と終了後でツールバーの状態が一致しないということが起こる。

大した問題ではないが気持ち悪いので、以下のように解決した。

解決後のレイアウト

<?xml version="1.0" encoding="utf-8"?>
<FragmeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <com.google.android.material.appbar.AppBarLayout
                android:id="@+id/appbar_layout"
                app:elevation="0dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            <androidx.appcompat.widget.Toolbar
                    android:id="@+id/toolbar"
                    app:layout_scrollFlags="enterAlways|scroll"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>

        </com.google.android.material.appbar.AppBarLayout>

        <!-- メインコンテンツを表示するための領域 -->
        <FrameLayout
                android:id="@+id/main_contents_layout"
                app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <!-- メインコンテンツのアイテムを選択したら遷移する追加画面の領域 -->
    <FrameLayout
            android:id="@+id/additional_content_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</FrameLayout>

わざわざ記事に残しておいてなんだが、せやなという感じしかしない。

See Also