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
相关产品推荐
相关产品推荐

