我有一个带有子NestedScrollView的底页。我想将整个NestedScrollView一直滚动到底部,而不必将底页向上滑动。
如果用户希望底片一直向上移动,则只能使用锚点。
现在,当使用开始向下滚动时,在滚动整个内容之后,我希望在下一个滚动操作中隐藏底部的表格。
由于默认的底页行为不允许我创建自己的自定义行为并覆盖onNestedScroll()和onNestedPreScroll()。
我面临两个问题:
1:Nestedscrollview会部分滚动并停止,因为相对于底部工作表,它看不到要滚动的更多内容。我必须向上滑动纸才能看到其余的内容。意味着我不展开工作表就看不到NestedScrollView中的最后一项。
2:如何检测NestedScrollChild是向上滚动还是向下滚动。因为我希望BottomSheet在滚动视图完成滚动其内容后拦截事件。我尝试了onNestedPreScroll,但似乎不一定每次孩子滚动时都会触发它。将侦听器附加到scrollview是唯一的解决方案吗?
链接以查看GIF中的问题 https://photos.app.goo.gl/RPmDFEtR9TbGHrau6
下面是我的布局和行为类。
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
/>
</com.google.android.material.appbar.AppBarLayout>
->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bottom_sheet_background_shaded"
android:elevation="10dp"
app:behavior_hideable="false"
app:behavior_peekHeight="35dp"
app:behavior_fitToContents="false"
app:layout_behavior="com.pyus13.bottomsheetsample.MyBottomSheetBehaviour">
<ImageView
android:id="@+id/anchor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="1dp"
android:src="@drawable/bottom_sheet_anchor_holder"
app:layout_constraintBottom_toTopOf="@+id/main_container"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.core.widget.NestedScrollView
android:id="@+id/main_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:clipToPadding="false"
android:elevation="5dp"
android:gravity="center"
android:paddingTop="20dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/anchor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/change_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Title 1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Title 2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Page 3"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Page 4"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Page 5"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Change Title"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
我的行为班级:
class MyBottomSheetBehaviour<V : View> @JvmOverloads constructor(
context: Context? = null, attrs: AttributeSet? = null) : BottomSheetBehavior<V>(context, attrs) {
private var isScrollingDown = false
override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
if (state == STATE_COLLAPSED || state == STATE_HALF_EXPANDED) {
return false
}
return super.onInterceptTouchEvent(parent, child, event)
}
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: V, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
Log.d("Scroll", "OnNestedScroll EVent $child $target $axes $type")
if (state == STATE_COLLAPSED || state == STATE_HALF_EXPANDED) {
if (target.canScrollVertically(1) || target.canScrollVertically(-1)) {
return false
}
}
return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
}
override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout, child: V, target: View, dx: Int, dy: Int, consumed: IntArray, type: Int) {
isScrollingDown = dy > 0
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type)
}
}
如果有人可以提供帮助,我希望得到这样的举动。