Android 可滚动全屏模态Bottom Sheet实现:上滑无法展开至90%高度
解决方案
你之前出现滑动无法触发展开的问题,是因为默认fitToContents为true时,BottomSheet的最大高度会被内容高度限制,且NestedScrollView的嵌套滚动会优先消费滑动事件,导致Behavior无法接收到拖拽信号,按以下步骤调整即可:
1. 修正布局配置
补充核心属性,修正闭合标签错误:
<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/design_bottom_sheet" style="@style/RootLayout" android:background="@drawable/rounded_shape" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" app:behavior_fitToContents="false" app:behavior_hideable="false"> <androidx.core.widget.NestedScrollView android:id="@+id/nested_scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" android:nestedScrollingEnabled="true"> <!-- 这里放你的内部内容 --> </androidx.core.widget.NestedScrollView> </FrameLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
2. 动态配置BottomSheetBehavior参数
在Dialog的onCreate生命周期中计算屏幕参数,配置Behavior的状态阈值:
// 获取屏幕高度 val displayMetrics = resources.displayMetrics val screenHeight = displayMetrics.heightPixels val halfScreenHeight = screenHeight / 2 val topOffset = (screenHeight * 0.1).toInt() // 展开后距离顶部10%屏高 // 初始化BottomSheetBehavior val bottomSheet = findViewById<FrameLayout>(R.id.design_bottom_sheet) val behavior = BottomSheetBehavior.from(bottomSheet) behavior.apply { peekHeight = halfScreenHeight // 初始折叠状态高度为半屏 expandedOffset = topOffset // 展开状态顶部偏移,即展开后占90%屏高 isDraggable = true state = BottomSheetBehavior.STATE_COLLAPSED // 初始状态为半屏折叠 }
3. 处理滑动冲突(可选)
如果依然存在滑动时无法拉伸的问题,给NestedScrollView添加触摸监听,未完全展开时优先把事件交给BottomSheet处理:
val nestedScrollView = findViewById<NestedScrollView>(R.id.nested_scroll_view) nestedScrollView.setOnTouchListener { _, event -> if (behavior.state != BottomSheetBehavior.STATE_EXPANDED) { bottomSheet.onTouchEvent(event) true } else { false } }
调整后即可实现初始半屏,上滑先拉伸到90%屏高,完全展开后再滚动内部内容的交互效果。
内容的提问来源于stack exchange,提问作者Hoang Thinh
相关产品推荐
相关产品推荐

