DialogFragment Can not perform this action after onSaveInstanceState 问题

377 阅读1分钟

问题描述

使用全局 LoadingDialog DialogFragment 弹框,或者 通用 DialogFragment 弹框时候,有时需要延时或者等接口回调后 dismiss 弹框,如果调用 此时 activity 退到后台, 则抛出异常

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

问题分析

Activity 退到后台,dialogFragment 所依赖的 Fragment / FragmentActivity,onSaveInstance 之后,会调用 dialogFragmentsaveAllState ,使得 fragmennt 的成员变量 mStateSaved = true. 在这之后 dialogFragmentFragmentTransaction 执行了commit() ,而 commit 操作过程中会进行 checkStateLoss() 校验,如果 mStateSaved || mStoppedtrue, 就会抛出异常

throw new IllegalStateException(
        "Can not perform this action after onSaveInstanceState")

解决方案

在 dialogFragment dismiss() 时候 判断 所属 FragmentManagerisStateSaved 是否为 true。

fun dismiss() {
    if (fragmentManager.isStateSaved) {
        return
    }
    loadingDialog.dismiss()
}

参考资料:

完美解决DialogFragment Can not perform this action after onSaveInstanceState 问题