BottomSheetDialogFragment不遵守STATE_HIDDEN,如何创建后保持隐藏无视图变化?
解决BottomSheetDialogFragment调用show()后保持完全隐藏无视图变化的问题
你遇到的问题核心是:调用show()后,BottomSheetDialog的Window默认仍会渲染背景变暗效果,即便BottomSheet本身设为隐藏状态,还是会留下视觉痕迹。直接用onShowListener调用hide()会触发显示→隐藏的动画,导致闪烁。
可以通过修改Dialog的Window属性,从根源上让对话框初始状态完全不可见,同时配合BottomSheetBehavior的设置,实现调用show()后无任何视图变化:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog val behavior = dialog.behavior // 固定BottomSheet为隐藏状态 behavior.state = BottomSheetBehavior.STATE_HIDDEN behavior.isHideable = true // 关键:调整Window属性,彻底隐藏对话框相关视觉元素 dialog.window?.apply { // 取消屏幕变暗效果 setDimAmount(0f) // 禁用窗口动画,避免任何可能的闪烁 setWindowAnimations(0) // 添加标记让窗口初始不显示 setFlags( WindowManager.LayoutParams.FLAG_NOT_SHOW_WHEN_LOCKED, WindowManager.LayoutParams.FLAG_NOT_SHOW_WHEN_LOCKED ) // 设置窗口背景为透明,消除底部可能出现的0高度占位 setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) } return dialog }
当后续条件满足需要显示BottomSheet时,再恢复窗口属性并切换BottomSheet状态即可:
fun triggerShowBottomSheet() { this.dialog?.let { sheetDialog -> sheetDialog.window?.apply { // 移除不显示的标记 clearFlags(WindowManager.LayoutParams.FLAG_NOT_SHOW_WHEN_LOCKED) // 恢复默认的屏幕变暗程度(可根据需求调整) setDimAmount(0.5f) } // 切换BottomSheet到需要的状态(折叠/展开) (sheetDialog as BottomSheetDialog).behavior.state = BottomSheetBehavior.STATE_COLLAPSED } }
这个方案的优势在于:对话框已经通过show()完成初始化,但从创建到条件满足前,不会在屏幕上产生任何可见变化,完全避免了闪烁或多余的视觉干扰。
内容的提问来源于stack exchange,提问作者Satty
相关产品推荐
相关产品推荐

