关于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。