dialogfragment导致的dialog显示异常

296 阅读1分钟

dialogfragment其实是fragment和dialog的结合,在create的时候会创建dialog对象,但是如果dialog执行dismiss的时候导致系统异常了,fragment没有正常销毁,下次activity在执行resume的时候这个fragment会重新创建,然后再创建一次dialog对象。

笔者项目中实际遇到这样的场景: 在activity为pause状态时,然后eventbus的onevent事件里接收事件,将dialogfragment执行dismiss,但是这个时候,会报错:

ava.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androidx.fragment.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1536) at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:1558) at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:317) at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:282)

原因是因为宿主activity已经执行了onSaveInstanceState,不能执行commit动作,而dialogfragment在dismiss时会调用commit。

此时如果activity再去执行onPause -> onResume的时候,dialogFragment会重新创建,dialog也会被创建,最终导致了最开始dialog又出现的bug。