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

如何让BottomSheetDialogFragment默认全展开/全隐藏(跳过半展开)?

解决BottomSheetDialogFragment默认全展开&下拉直接隐藏的问题

一、设置默认直接完全展开

核心是通过BottomSheetBehavior修改初始状态,并关闭半展开支持。在你的BottomSheetDialogFragment子类中重写onStart()方法:

Kotlin 实现

override fun onStart() {
    super.onStart()
    val bottomSheet = dialog?.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)
    bottomSheet?.let {
        val behavior = BottomSheetBehavior.from(it)
        // 强制初始状态为完全展开
        behavior.state = BottomSheetBehavior.STATE_EXPANDED
        // 关闭半展开状态,只保留展开和隐藏两种状态
        behavior.skipCollapsed = true
        // 可选:设置peekHeight为屏幕高度,确保展开时铺满全屏
        behavior.peekHeight = resources.displayMetrics.heightPixels
    }
}

Java 实现

@Override
public void onStart() {
    super.onStart();
    View bottomSheet = getDialog().findViewById(com.google.android.material.R.id.design_bottom_sheet);
    if (bottomSheet != null) {
        BottomSheetBehavior<?> behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        behavior.setSkipCollapsed(true);
        behavior.setPeekHeight(getResources().getDisplayMetrics().heightPixels);
    }
}

关键说明:skipCollapsed = true是核心开关,它会让BottomSheet跳过半展开的折叠状态,只在展开和隐藏之间切换。

二、设置下拉(Fling操作)直接隐藏

上述的skipCollapsed = true已经能解决这个问题——当该属性开启后,下拉(包括Fling)时BottomSheet会直接从展开状态切换到隐藏状态,不会停留在半展开状态。

如果遇到特殊场景下仍有半展开残留,可以额外添加滑动回调强化逻辑:

Kotlin 实现

behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
    override fun onStateChanged(bottomSheet: View, newState: Int) {
        // 当检测到向下拖拽且进度低于50%时,直接触发隐藏
        if (newState == BottomSheetBehavior.STATE_DRAGGING && behavior.progress < 0.5f) {
            behavior.state = BottomSheetBehavior.STATE_HIDDEN
        }
    }

    override fun onSlide(bottomSheet: View, slideOffset: Float) {}
})

Java 实现

behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_DRAGGING && behavior.getProgress() < 0.5f) {
            behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
});

内容的提问来源于stack exchange,提问作者卡尔斯路西法

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:43:23