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

如何阻止Android DialogFragment在页面恢复时重放进入动画

问题根因

该动画重放和DialogFragment本身是否重建无关,是Android系统Window机制的默认行为:应用退入后台时,Dialog对应的Window会被从WindowManager中移除,应用切回前台时Window会被重新附加到WindowManager,此时你设置的windowAnimations属性中配置的进入动画会被自动触发,导致二次播放。

最优解决方案

通过标记位区分首次展示和后续窗口重附场景,分别设置不同的动画样式即可,既不需要在onPause里做临时修改,也完全兼容原有退出动画逻辑:

  1. 先新增一个仅包含退出动画、没有进入动画的样式
<style name="AnimationOnlyExitFromRight" parent="Animation.AppCompat.Dialog">
    <item name="android:windowExitAnimation">@anim/exit_from_right</item>
    <!-- 这里用0时长的透明动画占位即可 -->
    <item name="android:windowEnterAnimation">@android:anim/fade_out</item>
    <item name="android:windowAnimationDuration">0</item>
</style>
  1. 修改DialogFragment的逻辑
// 标记Dialog是否已经完成过首次展示
private var hasCompletedFirstShow = false

override fun onStart() {
    super.onStart()
    dialog?.takeIf { showsDialog }?.window?.run {
        attributes = attributes.apply {
            windowAnimations = if (hasCompletedFirstShow) {
                // 非首次展示,用不带进入动画的样式
                R.style.AnimationOnlyExitFromRight
            } else {
                // 首次展示用原来的进出动画样式
                R.style.AnimationEnterExitFromRight
            }
        }
    }
}

override fun onResume() {
    super.onResume()
    // 首次执行完onResume说明已经完成首次展示,更新标记位
    hasCompletedFirstShow = true
}

同时可以删掉原有onActivityCreated中的动画设置逻辑,以及onPause中的临时修改逻辑,onActivityCreated本身在AndroidX Fragment 1.3.0+版本已被废弃,将逻辑迁移到onStart/onCreateDialog也更符合官方规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:57:04