Android 未调用作为CoordinatorLayout的直接子级的BottomNavigationView上的SetOnApplyWindowInsertsListener

Android 未调用作为CoordinatorLayout的直接子级的BottomNavigationView上的SetOnApplyWindowInsertsListener,android,android-layout,material-design,bottomnavigationview,Android,Android Layout,Material Design,Bottomnavigationview,这是一个带有BottomNavigationView的非常简单的布局 <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+i

这是一个带有BottomNavigationView的非常简单的布局

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EEEEEE">
    <!--
    OUTLINE
    <CoordinatorLayout>
        <AppbarLayout>
             <Toolbar/>
             <TabLayout/>
        <AppbarLayout >
        <ViewPager2/>
        <BottomNavigationView/>
    </CoordinatorLayout>
    -->

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f00"
        android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbar"
            android:layout_width="match_parent"
            android:layout_height="256dp"
            android:background="#ff0"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="@android:color/transparent">

            <ImageView
                android:id="@+id/ivHeader"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/header"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax" />

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                android:background="#55ff0000"
                android:layout_gravity="top"
                android:layout_marginBottom="?attr/actionBarSize" />

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:background="@android:color/transparent"
                app:tabIconTint="#F57C00"
                app:tabIndicatorColor="#F57C00"
                app:tabIndicatorHeight="4dp"
                app:tabMode="scrollable"
                app:tabSelectedTextColor="#F5F5F5"
                app:tabTextColor="#FFE0B2" />

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

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

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:menu="@menu/main" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>
通过将root
CoordinatorLayout
作为参数传递给此函数。设置主题为

@颜色/状态\u栏\u颜色 真的 @颜色/导航条颜色 和初始图像,无需设置任何插图

如图所示,工具栏位于状态栏下方,而底部导航视图位于导航栏下方

所以我设置了
setonapplywindowinsetsleener

    bottomNav.setOnApplyWindowInsetsListener { view, insets ->
        view.updatePadding(bottom = insets.systemWindowInsetBottom)
        insets
    }
但它没有被调用。因此,我在AppbarLayout、CollasingLayout和ImageView上设置了插图,就像我在android:fitsSystemWindows上所做的那样

appbar.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top = insets.systemWindowInsetTop)
    insets
}

collapsingToolbar.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top =  insets.systemWindowInsetTop)
    insets
}

ivHeader.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top = insets.systemWindowInsetTop)
    insets
}
我明白了

红色背景属于AppbarLayout,黄色背景属于CollingToolBarLayout

现在,BottomNavigationView的
setOnApplyWindowInsetsListener
被调用,我想是inset被修复了


我的问题是,为什么在没有调用insets forCollasingToolbarLayout的情况下不调用它,以及为什么CollasingToolbarLayout和AppbarLayout之间存在差距?

我发现CollasingToolbarLayout有一个bug,它阻止接收insets,如中所述。在
AppBarLayout
上方设置布局可确保其他视图接收插入

但我仍然无法找到如何为问题中的布局正确应用插图/填充

appbar.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top = insets.systemWindowInsetTop)
    insets
}

collapsingToolbar.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top =  insets.systemWindowInsetTop)
    insets
}

ivHeader.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(top = insets.systemWindowInsetTop)
    insets
}