在我的应用中,我使用DialogFragments。
有时候,我会得到
片段已添加IllegalStateException
,应用崩溃。这些崩溃是在crashlytics上看到的。
在第一个实例被解雇之前尝试显示相同的对话框片段两次时,似乎会发生此问题。
这个问题已经像here或here一样被讨论过很多次,但问题是,它并不是在所有设备上都保持不变的行为。
我无法在办公桌上重现此问题。 即使我尝试两次显示相同的对话框,也不会出现此异常。
我什至使用fragment.isAdded()
来确保显示它,然后再次显示它。当然只是为了捕捉错误。但没有成功。
有什么想法吗?
我可以在显示对话框之前添加fragment.isAdded()
条件来防止这种情况,但是我想了解这种情况的根本原因。我担心无法复制此内容。
这是我的代码的一部分,以显示该对话框:
MyDialog
扩展了DialogFragment
MyDialog dialog = (MyDialog) getSupportFragmentManager().findFragmentByTag(MyDialog.TAG);
if(dialog == null) { //create and show the dialog
dialog = new MyDialog();
dialog.setCancelable(false);
}
dialog.show(getSupportFragmentManager(), MyDialog.TAG);
答案 0 :(得分:0)
我想我已经找到问题了。
首先,在这里使用dialog.isAdded()
有帮助。
但是这里的问题与该应用的instanceState
有关。
正如我所说,此错误并非在所有设备或用户上都发生,因此很难发现。
首先,我的应用配置为仅纵向。 对话框打开时,如果用户由于某种原因导航到某个其他应用程序(例如电话或其他应用程序),这又导致我的应用程序进入onStop并导致该其他应用程序更改配置。
例如,当对话框打开时,按主屏幕按钮并转到手机设置并更改语言,这将导致配置更改,并在导航到该应用时重新创建该应用。
当用户导航回到我的应用程序时,它被系统杀死,并尝试重新创建堆栈,并且onSaveInstanceState不为null,对话框已经在堆栈中,并且我的应用程序尝试再次显示它。
这会杀死该应用程序。