如何仅固定 CollapsingToolbarLayout 的最后一个子项?
How to Pin only the last child of the CollapsingToolbarLayout?
假设我有以下 .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>
我希望只有 CollapsingToolbarLayout
的最后一个子项在滚动时固定到顶部。问题是,如果我让 xml 保持原样,它的子项将全部放在它上面,相互重叠(因为 CollapsingToolbarLayout
继承 FrameLayout
)
知道 AViewThatShouldPinOnTopOnScroll
的高度可能会有所不同,如何仅通过编辑 XML 来实现我想要的?
要实现此行为,AViewThatShouldPinOnTopOnScroll
需要是 AppBarLayout
的直接子代;即从 CollapsingToolbarLayout
中取出它;不需要 app:layout_collapseMode="pin"
因为它不再是 CollapsingToolbarLayout
的一部分:
现在的XML结构:
<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>
演示
黄色的是AViewThatShouldPinOnTopOnScroll
解决问题的一个简单例子是:
<CoordinatorLayout>
<AppBarLayout>
<!-- scrolls -->
<Toolbar
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll" />
<!-- pins -->
<TextView
android:layout_marginTop="?attr/actionBarSize" />
</AppBarLayout>
</CoordinatorLayout>
假设我有以下 .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>
我希望只有 CollapsingToolbarLayout
的最后一个子项在滚动时固定到顶部。问题是,如果我让 xml 保持原样,它的子项将全部放在它上面,相互重叠(因为 CollapsingToolbarLayout
继承 FrameLayout
)
知道 AViewThatShouldPinOnTopOnScroll
的高度可能会有所不同,如何仅通过编辑 XML 来实现我想要的?
要实现此行为,AViewThatShouldPinOnTopOnScroll
需要是 AppBarLayout
的直接子代;即从 CollapsingToolbarLayout
中取出它;不需要 app:layout_collapseMode="pin"
因为它不再是 CollapsingToolbarLayout
的一部分:
现在的XML结构:
<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>
演示
黄色的是AViewThatShouldPinOnTopOnScroll
解决问题的一个简单例子是:
<CoordinatorLayout>
<AppBarLayout>
<!-- scrolls -->
<Toolbar
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll" />
<!-- pins -->
<TextView
android:layout_marginTop="?attr/actionBarSize" />
</AppBarLayout>
</CoordinatorLayout>