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

如何禁用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:07:13