如何使用折叠工具栏布局处理滚动

How to handle scrolling with Collapsing Toolbar Layout

我在我的应用程序中添加了折叠工具栏,但现在只有当用户在 CollapsingToolbarLayout 中滚动图像视图时它才会折叠。当用户从视图中的任何位置滚动时如何折叠工具栏?

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.ProfileActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/profile_image"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:scaleType="centerCrop"
            android:src="@drawable/default_avatar"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="0.7" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

<include layout="@layout/profile_contents"
    app:layout_anchor="@+id/app_bar"
    app:layout_anchorGravity="bottom"
    android:layout_gravity="bottom"
    android:layout_height="wrap_content"
    android:layout_width="match_parent" />


</android.support.design.widget.CoordinatorLayout>

这些是目前profile_contents.xml的内容,因为我将在以后添加更多项目。

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


<TextView
    android:id="@+id/profile_displayName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="32dp"
    android:text="loading name..."
    android:textColor="@color/black"
    android:textSize="24dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/profile_status"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="32dp"
    android:text="loading status..."
    android:textColor="@color/black"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/profile_displayName" />

<Button
    android:id="@+id/profile_send_req_btn"
    android:layout_width="182dp"
    android:layout_height="38dp"
    android:layout_marginTop="44dp"
    android:background="@drawable/profile_button_bg"
    android:padding="10dp"
    android:text="@string/send_friend_request"
    android:textAllCaps="false"
    android:textColor="@color/white"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/profile_status" />

</android.support.constraint.ConstraintLayout>

将其添加到 profile_contents 布局的根视图中

app:layout_behavior="@string/appbar_scrolling_view_behavior"

We need to define an association between the AppBarLayout and the View that will be scrolled. Add an app:layout_behavior to a RecyclerView or any other View capable of nested scrolling such as NestedScrollView. The support library contains a special string resource @string/appbar_scrolling_view_behavior that maps to AppBarLayout.ScrollingViewBehavior, which is used to notify the AppBarLayout when scroll events occur on this particular view. The behavior must be established on the view that triggers the event.

以上文字来自这里https://guides.codepath.com/android/handling-scrolls-with-coordinatorlayout

将包含的布局放在 NestedScrollView 视图中,因为 ConstraintLayout 不是可滚动视图。

像这样:

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="bottom"
    app:layout_anchor="@+id/app_bar"
    app:layout_anchorGravity="bottom"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <include layout="@layout/profile_contents"
        android:layout_height="wrap_content"
        android:layout_width="match_parent" />

</androidx.core.widget.NestedScrollView>

不要忘记将 app:layout_behavior 放在 NestedScrollView