如何禁用BottomSheetDialogFragment后台返回时的重复动画?
解决BottomSheetDialogFragment后台返回重复播放滑入动画的问题
这个问题是BottomSheetDialog的一个常见小坑:当应用切换到后台再返回前台时,已显示的BottomSheetDialogFragment会重新执行滑入动画,本质是因为系统重新关联了Dialog的Window,默认的入场动画配置被再次触发。下面给你两个简单可靠的解决方案:
方案一:用标志位控制动画触发时机
通过添加一个标志位记录是否是首次显示,在Dialog显示时动态控制是否启用动画:
class MyDialogFragment : BottomSheetDialogFragment() { var listener: Listener? = null // 标记是否为首次显示对话框 private var isFirstShow = true override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog dialog.setOnShowListener { if (!isFirstShow) { // 非首次显示,移除入场动画 dialog.window?.setWindowAnimations(0) } // 首次显示后将标志位设为false isFirstShow = false } return dialog } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // 保持你原有的布局填充和UI初始化逻辑 return inflater.inflate(R.layout.your_dialog_layout, container, false) } interface Listener { // 你的回调方法定义 } }
方案二:通过savedInstanceState判断是否重建
如果你的DialogFragment可能被系统销毁重建,也可以通过savedInstanceState来判断,仅在首次创建时启用动画:
class MyDialogFragment : BottomSheetDialogFragment() { var listener: Listener? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = BottomSheetDialog(requireContext(), theme) // 仅在首次创建(无保存状态)时设置动画,恢复时禁用 if (savedInstanceState == null) { // 这里可以用BottomSheet默认的动画,或者你自定义的动画样式 dialog.window?.setWindowAnimations(com.google.android.material.R.style.DesignBottomSheetDialog) } else { dialog.window?.setWindowAnimations(0) } return dialog } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // 原有的布局和UI逻辑 return inflater.inflate(R.layout.your_dialog_layout, container, false) } interface Listener { // 你的回调方法 } }
两种方案都能有效避免后台返回时的重复动画,方案一更通用,不管Fragment是否被销毁重建都能生效;方案二更适合需要区分首次创建和重建场景的情况。
内容的提问来源于stack exchange,提问作者Favolas
相关产品推荐
相关产品推荐

