DialogFragment退出动画显示空白白屏,如何显示后台Fragment?
解决DialogFragment退出动画显示白屏问题
问题本质
DialogFragment退出动画时显示白屏,核心原因是Dialog的Window未设置透明背景,或动画仅绑定到了Dialog的内容View而非Window容器,导致动画过程中系统遮挡了后台的Fragment内容。
具体解决方案
1. 设置Dialog窗口背景为透明
在DialogFragment的onStart()方法中配置Window属性,确保动画期间能透出后台内容:
override fun onStart() { super.onStart() dialog?.window?.apply { // 设置完全透明背景 setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) // 按需调整窗口布局参数(可选) setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) } }
2. 同时为View和Window绑定退出动画
原代码仅给Dialog的内容View添加了动画,需同时为Window设置退出动画,避免系统提前隐藏Dialog容器:
override fun dismiss() { dismissListener?.invoke() exitAnimation?.let { animRes -> val animation = AnimationUtils.loadAnimation(requireContext(), animRes) animation.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) {} override fun onAnimationRepeat(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { callDismiss() } }) // 给内容View添加动画 view?.startAnimation(animation) // 给Dialog窗口绑定退出动画 dialog?.window?.setWindowAnimations(animRes) } ?: callDismiss() } private fun callDismiss() { super.dismiss() }
3. 使用正确的FragmentManager启动Dialog
从导航组件中的Fragment(如C)启动Dialog时,直接使用当前Fragment的parentFragmentManager即可:
// 在Fragment C中启动DialogFragment D D().show(parentFragmentManager, "D_TAG")
4. 优化动画资源配置
确保退出动画包含透明渐变效果,让Dialog逐渐透明以透出后台内容,示例res/anim/slide_out.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="0%" android:toYDelta="100%"/> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0"/> </set>
内容的提问来源于stack exchange,提问作者htafoya
相关产品推荐
相关产品推荐

