调试 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.
我注意到我实现的折叠工具栏有两个小问题。我注意到的第一件事是它在工具栏和它下面的 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.