【发布时间】:2021-05-31 18:20:34
【问题描述】:
我有一个如下图所示的视图层次结构。
我遇到了奇怪的滚动行为,例如,
- 如果我从区域 1 滚动(缓慢拖动或甩动)
AppBar会随之折叠。这很好。 - 但如果我从区域 2 缓慢拖动,
AppBar不会崩溃。它留在那里,RecyclerView在它下面。但是,它可以很好地处理。
activity_challenge_detail.xml
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".challengedetail.ChallengeDetailActivity">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentScrim="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.2">
<FrameLayout
android:id="@+id/challengeBannerFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:foreground="@drawable/banner_gradient"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/challengeBanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/challenge_banner"
android:scaleType="centerCrop"
tools:src="@tools:sample/avatars" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.Toolbar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/dp16"
app:layout_collapseMode="pin">
<com.company.widget.StatusBarSpacer
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.CollapsingToolbarLayout>
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp"
app:layout_collapseMode="pin">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/switchingTabsBar"
android:layout_width="match_parent"
android:layout_height="@dimen/dp0"
android:background="@drawable/switching_tab_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tabBackground="@drawable/active_tab_selector"
app:tabIconTint="@color/black"
app:tabIndicator="@drawable/active_tab_indicator"
app:tabIndicatorColor="@color/yellow_500"
app:tabMode="fixed"
app:tabRippleColor="@null" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/challengeDetailsViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
fragment_challenge_post.xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_challenge_post"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".challengedetail.fragment.ChallengePostFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/challengePostRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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"
tools:itemCount="1"
tools:listitem="@layout/list_item_post" />
</androidx.constraintlayout.widget.ConstraintLayout>
list_item_post.xml
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="@dimen/dp16"
app:cardElevation="@dimen/dp0"
app:strokeColor="@color/gray_f5"
app:strokeWidth="@dimen/dp1">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/dp16">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/userImageView"
android:layout_width="@dimen/dp48"
android:layout_height="@dimen/dp48"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:shapeAppearanceOverlay="@style/ShapeAppearance.userProfileImage"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/userNameText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:lineSpacingExtra="5sp"
android:textAppearance="@style/Inter.Semi.16"
app:layout_constraintStart_toEndOf="@+id/userImageView"
app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/full_names" />
<TextView
android:id="@+id/timestampText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:lineSpacingExtra="7sp"
android:textAppearance="@style/Inter.Regular.14"
app:layout_constraintStart_toEndOf="@+id/userImageView"
app:layout_constraintTop_toBottomOf="@+id/userNameText"
tools:text="2 hrs ago" />
<com.company.widget.NestedScrollableHost
android:id="@+id/viewPagerHost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/userImageView"
tools:layout_constraintDimensionRatio="1:1">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/postImagesViewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.company.widget.NestedScrollableHost>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
我已经尝试过其他问题的解决方案,例如将嵌套的 ViewPager2 包装为 NestedScrollableHost 类。但它似乎没有用。有什么想法吗?
【问题讨论】:
-
您能否粘贴您的 XML 以便更清晰?
-
@che10 嘿,我已经添加了 XML 代码,谢谢。
-
可能是由于外部
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout是这一切的父级吗?SwipeRefreshLayout据我所知需要一个可滚动的子项,据我所知它是 ScrollView 还是 RecyclerView。 -
尝试删除刷新布局。
-
@che10 @Morpheus 没用,我刚去掉
SwipeRefreshLayout后试了一下。
标签: android android-layout android-coordinatorlayout android-viewpager2