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

Kotlin中如何持续监听BottomSheet状态以控制指定视图显隐

问题根因

你当前的状态判断逻辑仅在Activity的onCreate生命周期执行一次,后续BottomSheet状态发生变化时不会触发重新判断,因此无法动态更新视图显隐。

修复方案

给BottomSheetBehavior注册状态变化监听器,每次BottomSheet状态变更时都会触发回调,你可以在回调中控制grid_opt的显隐。

完整可运行代码

class dashboard : AppCompatActivity() {
    private lateinit var bottomSheetBehavior: BottomSheetBehavior<ConstraintLayout>
    // 声明回调变量,方便后续销毁时移除避免内存泄漏
    private val sheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            when (newState) {
                BottomSheetBehavior.STATE_EXPANDED -> grid_opt.isVisible = false
                BottomSheetBehavior.STATE_COLLAPSED -> grid_opt.isVisible = true
                // 可按需补充其他状态的处理逻辑:STATE_DRAGGING/STATE_SETTLING/STATE_HIDDEN
            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
            // 如需实现随拖拽进度联动的动画效果可在此处编写逻辑,无需求留空即可
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.dashboard_main)

        bottomSheetBehavior = BottomSheetBehavior.from(persistent_bottom_sheet)
        // 设置初始状态为展开
        bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
        // 注册状态监听
        bottomSheetBehavior.addBottomSheetCallback(sheetCallback)
    }

    override fun onDestroy() {
        // 页面销毁时移除监听器,避免内存泄漏
        bottomSheetBehavior.removeBottomSheetCallback(sheetCallback)
        super.onDestroy()
    }
}

高版本Material组件适配说明

如果你使用的是1.5.0及以上版本的Material组件库,addBottomSheetCallback已被废弃,可改用更简洁的状态监听API:

// 注册状态监听
val stateChangedListener = BottomSheetBehavior.OnStateChangedListener { _, newState ->
    when (newState) {
        BottomSheetBehavior.STATE_EXPANDED -> grid_opt.isVisible = false
        BottomSheetBehavior.STATE_COLLAPSED -> grid_opt.isVisible = true
    }
}
bottomSheetBehavior.addOnStateChangedListener(stateChangedListener)

// 销毁时移除
override fun onDestroy() {
    bottomSheetBehavior.removeOnStateChangedListener(stateChangedListener)
    super.onDestroy()
}

内容的提问来源于stack exchange,提问作者Abinab Dangi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:02