You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:45:05