Home > Back-end >  How to Pin only the last child of the CollapsingToolbarLayout?
How to Pin only the last child of the CollapsingToolbarLayout?

Time:03-25

Suppose I have the following .xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout>
    
    <com.google.android.material.appbar.AppBarLayout>
        
        <com.google.android.material.appbar.CollapsingToolbarLayout>
            
            <androidx.appcompat.widget.Toolbar>
                <!--ToolBar here-->
            </androidx.appcompat.widget.Toolbar>

            <!-- scrolls with the recycler view - may have different heights -->
            <PageTitleHere
                app:layout_collapseMode="none"/>

            <!-- This view pins on top when scrolling -->
            <AViewThatShouldPinOnTopOnScroll
                app:layout_collapseMode="pin" />

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

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

    <androidx.recyclerview.widget.RecyclerView
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

I want that only the last child of CollapsingToolbarLayout pins to the top when scrolling. The problem is that if I leave the xml as it is, its children will all be placed on top of it, overlaying each other (because CollapsingToolbarLayout inherits FrameLayout)

Knowing that the height of AViewThatShouldPinOnTopOnScroll may vary, how can I achieve what I want by only editing the XML?

CodePudding user response:

To achieve this behavior, the AViewThatShouldPinOnTopOnScroll requires to be a direct child of the AppBarLayout; i.e. get it out of the CollapsingToolbarLayout; and no need to the app:layout_collapseMode="pin" as it's not a part of the CollapsingToolbarLayout anymore:

The XML structure now:

<com.google.android.material.appbar.AppBarLayout>
    
    <com.google.android.material.appbar.CollapsingToolbarLayout>
        
        <androidx.appcompat.widget.Toolbar>
            <!--ToolBar here-->
        </androidx.appcompat.widget.Toolbar>

        <!-- scrolls with the recycler view - may have different heights -->
        <PageTitleHere/>

    </com.google.android.material.appbar.CollapsingToolbarLayout>
    
    <!-- This view pins on top when scrolling -->
    <AViewThatShouldPinOnTopOnScroll/>

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

Demo

The yellow is the AViewThatShouldPinOnTopOnScroll

CodePudding user response:

A simple example to solve the problem is:

<CoordinatorLayout>
    <AppBarLayout>
        <!-- scrolls -->
        <Toolbar
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll" />
        <!-- pins -->
        <TextView
            android:layout_marginTop="?attr/actionBarSize" />
    </AppBarLayout>
</CoordinatorLayout>
  • Related