在 ConstraintLayout 中滚动 RecyclerView 时如何折叠工具栏?

Posted

技术标签:

【中文标题】在 ConstraintLayout 中滚动 RecyclerView 时如何折叠工具栏?【英文标题】:How to collapse the toolbar while I'm scrolling through a RecyclerView in ConstraintLayout? 【发布时间】:2020-01-17 01:05:17 【问题描述】:

我有一个活动,我设置了 NavigationDrawer 并且工作正常。这个活动承载了我使用过的片段:

setHasOptionsMenu(true);

启用菜单。我添加了一个 SearchView 并覆盖 onCreateOptionsMenu():

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) 
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.search);
    //Do some search stuff

一切正常。这是我的片段的布局文件:

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_
        android:layout_/>

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

现在我想在滚动RecyclerView 时折叠工具栏。我知道我可以在我的布局文件中添加一个AppBarLayout 并在其中添加一个Toolbar,但是是否有可能在 ConstraintLayout 中实现与现有行为相同的行为?

【问题讨论】:

动画不会那么流畅,你将重新发明***。最好只添加一个 AppBarLayout 和一个工具栏。此外,如果您要添加 appbarlayout,请考虑 CoordinatorLayout 也许这会有所帮助。 journaldev.com/13927/android-collapsingtoolbarlayout-example @sonnet 谢谢你。我发现的所有示例都使用CoordinatorLayout。这是最好的方法吗?如果我仍然想通过ConstraintLayout 实现这一目标,我应该怎么做? @Jorn AFAIK,CoordinatorLayout 是唯一具有您正在寻找的功能的本机视图。如果您想完全隐藏toolbar,则需要深入了解android开发。 【参考方案1】:

CoordinatorLayout:

最好的办法是使用CoordinatorLayout。一个类似的问题here 应该能够帮助你。

既然您想通过ConstraintLayout 实现这一目标:

您必须为您的RecyclerView 创建一个OnScrollListener 类。该类将有一个 onScrolled() 方法,该方法将具有参数 - dx、dy、水平和垂直滚动的数量。 Here 是一个关于如何跟进的链接。

希望对你有帮助:)

【讨论】:

【参考方案2】:

您可以在 CordinaterLayout 的帮助下完成此操作。请查看此答案。

Hide AppBar when scrolling down

【讨论】:

谢谢,但我的问题与ConstraintLayout 有关。我可以用它实现同样的目标吗?如果是,怎么做? 是的,您可以使用 ConstraintLayout 实现相同的效果。 1:添加ConstraintLayout的CordinateLayout的ParentLayout 2:使用也可以使用android.support.design.widget.CollapsingToolbarLayout 3:启用rescyclerView的nestedscroll视图。 这可能是一条评论。请不要只是为了发布另一个现有解决方案的链接而回答 @umerfarooq 我不想在.XML 文件中使用带有`Toolbar` 的AppBarLayout,我只想使用现有的。有可能吗?【参考方案3】:
 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_
  android:layout_
  xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.core.widget.NestedScrollView
  android:layout_
  android:layout_>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_
    android:layout_/>
 </androidx.core.widget.NestedScrollView>

 <ProgressBar
    android:id="@+id/progress_bar"
    android:layout_
    android:layout_
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

 </androidx.constraintlayout.widget.ConstraintLayout>

在片段中使用此布局(在 Nestedscrollview 中包装 Recyclerview)。

在主布局中,在 Coordinator 布局中使用 AppbarLyaout 像这样

  <androidx.coordinatorlayout.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_
        android:layout_
        android:id="@+id/DashCoor"
        android:fitsSystemWindows="true"
        tools:context=".Activities.DashboardActivity">


        <com.google.android.material.appbar.AppBarLayout
            android:layout_
            android:layout_
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


            <com.google.android.material.appbar.CollapsingToolbarLayout
                android:layout_
                android:layout_
                android:visibility="gone"
                app:expandedTitleMarginStart="48dp"
                app:expandedTitleMarginEnd="64dp"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                >
                ​


               //Layout to be collpased

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

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_
                android:layout_
                app:titleTextColor="@color/white"
                android:fitsSystemWindows="true"
                android:minHeight="?attr/actionBarSize"
                app:theme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                />

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

         </androidx.coordinatorlayout.widget.CoordinatorLayout>

希望你解决它:)

【讨论】:

以上是关于在 ConstraintLayout 中滚动 RecyclerView 时如何折叠工具栏?的主要内容,如果未能解决你的问题,请参考以下文章

在 ConstraintLayout 中滚动 RecyclerView 时如何折叠工具栏?

ConstraintLayout 内的 NestedScrollView 不可滚动

DrawerLayout 内的 constraintLayout 内的 RecyclerView 不会滚动

Android ConstraintLayout ScrollView 不滚动

ConstraintLayout2.0一篇写不完之嵌套滚动怎么滚

用户滚动到 ScrollView Android 底部后启用按钮