如何阻止Android DialogFragment在页面恢复时重放进入动画
问题根因
该动画重放和DialogFragment本身是否重建无关,是Android系统Window机制的默认行为:应用退入后台时,Dialog对应的Window会被从WindowManager中移除,应用切回前台时Window会被重新附加到WindowManager,此时你设置的windowAnimations属性中配置的进入动画会被自动触发,导致二次播放。
最优解决方案
通过标记位区分首次展示和后续窗口重附场景,分别设置不同的动画样式即可,既不需要在onPause里做临时修改,也完全兼容原有退出动画逻辑:
- 先新增一个仅包含退出动画、没有进入动画的样式
<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>
- 修改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
相关产品推荐
相关产品推荐

