关于DialogFragment抛出java.lang.IllegalStateException

关于DialogFragment抛出java.lang.IllegalStateException

Can not perform this action after onSaveInstanceState异常:

onSaveInstanceState方法是在Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后 再给它添加Fragment就会出错。

看源码我们可以发现这个异常是在FragmentManagerImpl.java类中


,而这个方法又是在


enqueueAction方法里执行的,关键点在allowStateLoss参数的值,这个值又是在


传递进去的,通过看DialogFragment的源码可以看出

DialogFragment的show方法调用的是commit(),也就是allowStateLoss的值为false,我们想要不抛出java.lang.IllegalStateException异常

1、我们需要把allowStateLoss的值改为true,也就是调用commitAllowingStateLoss()方法就可以了,所以我们可以在BaseDialogFragment中重写一下它的show方法,

我这里用的是kotlin写的,不知道的同学可以阅读下:Kotlin 用于 Android 开发 - Kotlin 语言中文站

```

override fun show(manager: FragmentManager?, tag: String?) {

val mClass = DialogFragment::class.java

val dismissed = mClass.getDeclaredField("mDismissed")

dismissed.isAccessible = true

dismissed.set(this,false)

val shownByMe = mClass.getDeclaredField("mShownByMe")

shownByMe.isAccessible = true

shownByMe.set(this,true)

val ft = manager?.beginTransaction()

ft?.add(this, tag)

ft?.commitAllowingStateLoss()

}

```

2、在调用show方法前需要先判断一下dialogfragment的isAdded的值是否为false,以及当前页面的activity的isDestroyed是否为false。

你可能感兴趣的:(关于DialogFragment抛出java.lang.IllegalStateException)