调试 Android 折叠工具栏 - insets 和 onResume

Debugging Android Collapsing Toolbar - insets and onResume

我注意到我实现的折叠工具栏有两个小问题。我注意到的第一件事是它在工具栏和它下面的 recyclerview/nested 滚动视图之间应用了一个插图,创建了一个明显的间隙,如图 A

所示

我注意到的第二个问题是当我向下滚动列表并且工具栏折叠时。如果我单击其中一个回收器视图项目并导航到下一个片段,然后单击后退按钮并返回,工具栏将折叠,但是图像是可见的并且需要一两秒钟来设置动画并再次变得不可见如图B.

我的XML布局

<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/mainContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/appBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/transparent"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        app:contentScrim="@color/logs_header"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/logs_header">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/child"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax">

            <ImageView
                android:id="@+id/headerImage"
                android:layout_width="match_parent"
                android:layout_height="@dimen/checkin_header_image"
                android:scaleType="fitXY"
                app:layout_collapseMode="parallax"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:srcCompat="@drawable/ic_logs_header" />

            <ImageView
                android:id="@+id/brain"
                android:layout_width="@dimen/layout_brain_size"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/_32sdp"
                android:adjustViewBounds="true"
                app:layout_collapseMode="parallax"
                 app:layout_constraintBottom_toBottomOf="@+id/headerImage"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="@+id/headerImage"
                app:srcCompat="@drawable/brain_workout_logs" />

            <com.google.android.material.textview.MaterialTextView
                android:id="@+id/heading"
                style="@style/heading.style"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/heading_margin_lr"
                android:layout_marginTop="@dimen/heading_margin_top"
                android:layout_marginEnd="@dimen/heading_margin_lr"
                android:text="@string/logs_title"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/headerImage" />

            <View
                android:id="@+id/dividerHeading"
                android:layout_width="match_parent"
                android:layout_height="@dimen/divider_height"
                android:layout_marginStart="@dimen/divider_heading_lr"
                android:layout_marginTop="@dimen/_12sdp"
                android:layout_marginEnd="@dimen/divider_heading_lr"
                android:background="?android:attr/dividerVertical"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/heading" />
        </androidx.constraintlayout.widget.ConstraintLayout>

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbarContainer"
            android:layout_width="match_parent"
            android:layout_height="@dimen/toolbar_height"
            android:background="@color/transparent"
            app:contentInsetStart="0dp"
            app:layout_collapseMode="pin">

            <include
                android:id="@+id/toolbarLayout"
                layout="@layout/toolbar_logs" />
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>

<androidx.core.widget.NestedScrollView
    android:id="@+id/childContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvLogs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_6sdp"
            android:layout_marginEnd="@dimen/_6sdp"
            android:nestedScrollingEnabled="false"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

谁能帮我找到根本原因并修复这两个小错误?

对于 space 问题,您必须从根 CoordinatorLayout 中删除 android:fitsSystemWindows="true" 属性。如果为真,则它会调整此视图的填充以将 space 留给系统 windows(例如:用于状态栏)。 根据 documentation

Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows.