- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有子 NestedScrollView 的 Bottom Sheet 。我想将整个 NestedScrollView 一直滚动到底部,而不要将 Bottom Sheet 向上滑动。
如果用户希望 Bottom Sheet 一直向上,他们必须使用 anchor ,别无他法。
现在,当使用开始向下滚动时,在滚动整个内容后,我希望 Bottom Sheet 在下一个滚动操作时隐藏。
由于默认的 Bottom Sheet 行为不允许我创建自己的自定义行为并覆盖 onNestedScroll() 和 onNestedPreScroll()。
我面临两个问题:
1 :Nestedscrollview 部分滚动并停止,因为相对于 Bottom Sheet ,它看到没有更多内容要滚动。我必须向上滑动表格才能看到其余内容。意味着如果不展开工作表,我看不到 NestedScrollView 中的最后一项。
2:如何检测 NestedScrollChild 是向上滚动还是向下滚动。因为我希望 BottomSheet 在 ScrollView 完成滚动其内容后拦截事件。我试过 onNestedPreScroll 但似乎每次滚动 child 时都不一定会触发它。将监听器附加到 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)
}
最佳答案
不过,我遇到了几乎相同的问题,布局有点不同,而且行为是根本不拦截嵌套滚动。由于仍然没有答案,我认为值得在这里分享我的经验。
所以,我的布局如下:
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
...
<LinearLayout
android:id="@+id/bottomSheetLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:backgroundTint="@color/colorPrimary"
android:orientation="vertical"
app:layout_behavior=".view.FullNestedScrollBottomSheetBehavior"
app:behavior_hideable="false"
app:behavior_peekHeight="@dimen/bottom_sheet_min_height"
>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/anchorImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="-4dp"
android:layout_gravity="center"
android:paddingTop="4dp"
android:src="@drawable/ic_baseline"
android:tint="@android:color/white"
/>
<com.google.android.material.tabs.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tabLayout"
app:tabTextColor="#b2ffffff"
app:tabIconTint="@color/selector_status_tab"
app:tabRippleColor="#42ffffff"
app:tabSelectedTextColor="@android:color/white"
app:tabIndicatorColor="@android:color/white"
>
...
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
/>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
我最终采用了以下方法:
BottomSheet
接受嵌套滚动:class FullNestedScrollBottomSheetBehavior<V: View>(
context: Context,
attrs: AttributeSet?
): BottomSheetBehavior<V>(context, attrs) {
override fun onStartNestedScroll(...) = false
}
ViewPager
的实际高度动态更改嵌套滚动元素的父级高度(在我的情况下,它是 NestedScrollView
,其中包含 RecyclerView
和 BottomSheet
)的可见部分:override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
bottomSheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {}
override fun onSlide(bottomSheet: View, slideOffset: Float) {
val height = view.height - bottomSheet.top - anchorImage.height + 4.dp - tabLayout.height
val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height)
viewPager.layoutParams = params
}
})
}
onSlide()
在您拖动 BottomSheet
之前不会调用, 上面的逻辑应该复制成 onViewCreated()
: override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.post {
val h = view.height - bottomSheetLayout.top - anchorImage.height + 4.dp - tabLayout.height
val p = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, h)
viewPager.layoutParams = p
}
// here goes the code from the second point
}
我认为提供的解决方案可能是实现问题中所需的确切行为的一个很好的技巧。
关于android - 允许 NestedScrollView 在具有自定义行为的 BottomSheet 内完全滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409691/
我有基于角度 Material 文档的以下代码: 在我的 HTML Abrir BottomSheet 并且,在我的页面 ts 存档中: import { Component, OnInit } f
我想要一些关于如何修改这段代码的帮助,这样我就可以用触摸手势上下滑动这个反应本机底片。我想出了怎么用纽扣来做。在我的Package.json中,我使用了@Gorhom/Bottom-Sheet,“re
我正在为我的一种布局使用 BottomSheet View 。对于一个非常具体的情况,我需要 BottomSheet 的动画持续时间,它通过 setState(...) 方法在布局中滑动。它应该在 4
FAB BottomSheet按下后出现在屏幕上,但是位置不对(见图1),我想做成图2的样子,怎么解决? 我的 Activity : public class FirstscreenActivity
我有一个包含产品详细信息卡片的 BottomSheet。问题是,当我在 Bottom Sheet 处于 展开 状态时单击产品详细信息上的 + 或 - 按钮时,它跳下来。 当它处于关闭状态并且我单击按钮
我正在尝试在我的应用程序中实现 BottomSheet。我正在学习安卓。我已经按照图书馆页面 here 中给出的说明实现了它.我使用了如下的 Java 代码。 findViewById(R.id.bu
我是 Android 的新手 BottomSheet并且我已经成功地尝试了有关如何使用它的示例,但大多数示例仅演示了通过查看点击事件显示/隐藏 BottomSheet。 现在我有以下代码: Botto
我正在使用 bottomsheetlayout 弹出窗口进行社交媒体共享。现在的问题是,它不止一次开放。请帮我解决这个问题。 在我的按钮上单击我调用 asynctask 以下载图像。 @Overrid
我试图不让 BottomSheet 填充整个屏幕,而是在展开时在上方留出一些空间。这是我的 onExpand 填充整个屏幕的代码。 bottomSheetBehavior = BottomSheetB
我有一个 FrameLayout (teaserContainer) 和 BottomSheet (invitesContainer)。 FrameLayout 位于 BottomSheet 之外(和
我一直在尝试设置 Bottomsheet Google 在他们的应用程序(例如 GOOGLE NEWS 等)中使用的方式, This is how Google's Bottomsheet looks
我正在尝试在 Android 中实现类似于下图的摘要 Bottom Sheet 库。有没有什么方法可以将多个 Bottom Sheet 附加到一个 View ,您可以向左/向右滑动以切换并让相邻的 V
目前我正在使用来自 this lib 的底页,我想实现这样的图片动画google map在滑动 bottomsheet 时,我想按照显示的图像一起滑动 imageview,我已经用过这个link fo
我有一个 Bottom Sheet ,里面有一个 NestedScrollView(见下文)。当我按下 FAB 按钮时,我想让这个 NestedScrollView 中的某些部分不可见。但是,当我将一
我正在尝试在布局中使用 BottomSheet。 Root View 是一个 CoordinatorLayout,我想在 Bottom Sheet 的顶部设置 Elevation,所以我将它设置为高值
编辑: package com.walkindeep.teammanagerpreview; import android.content.Context; import android.os.Bun
我遇到 BottomSheetBehaviour 的问题。BottomSheet 在开始时没有扩展到最大高度。但是,它可以滚动到最大高度。但我不想滚动,而是希望 BottomSheet 扩展到其最大高
所以我在 CoordinatorLayout 中使用嵌套子滚动的新支持库行为,我有这样的 View : 我的应用程序有一个要求,这不是新要求,我需要暂时禁用协调器布局的某些元素的滚动。对于这个 b
我已经使用 NestedScrollView 实现了 Bottom Sheet 行为。并且想知道是否可以在外部触摸时隐藏底部 View 。 最佳答案 我终于可以做到了, 使用了以下代码行: @Over
我知道可以像这样设置普通的底板 rememberModalBottomSheetState( initialValue = ModalBottomSheetValue.Hidden, conf
我是一名优秀的程序员,十分优秀!