每次用户进入Activity
时,我都需要显示一个DialogFragment
,因此最好的回调方法是onResume()
。问题是我不能只调用 DialogFragment#show()
因为它会抛出一些 IllegalStateException
,所以我这样做了:
@Override
protected void onResume() {
super.onResume();
if(!dialog.isVisible()) {
dialog.show(getSupportFragmentManager(), "login-dialog");
}
}
@Override
protected void onPause() {
super.onPause();
if(dialog.isVisible()) {
dialog.dismiss();
}
}
我得到:
java.lang.IllegalStateException: Fragment already added: LoginDialog{41fac3e0 #0 login-dialog}
最佳答案
在尝试保持 DialogFragment 可见并在屏幕旋转(方向更改)之间工作时,我遇到了完全相同的异常和消息。 您的 fragment 来自支持库吗?
就我而言,我使用的是支持库,对 dialog.show()
的调用位于 Activity 的 onCreate()
中。似乎已经解决了这个问题的是这里提出的解决方法:
https://stackoverflow.com/a/14016339/3577211
这基本上是将 setRetainInstance(true)
放入 DialogFragment 的 onCreate()
中。第二部分,即覆盖其 onDestroy ,是我设法使 DialogFragment 在屏幕旋转期间不会消失(并在再次旋转时返回)的唯一方法,即使他们说最新支持库版本解决了这个问题(也许我把这里的 jar 弄得一团糟)。
您没有说明您是否始终遇到异常,或者仅在第一次创建 Activity 时才起作用。但我猜测发生的是 dialog.show()
实际上是 getFragmentManager().add()
调用的包装器,它可能会检查 dialog
的 setRetainInstance
是否为 true
,如果为 false
,则 DialogFragment
code> 实例再次添加到同一个 FragmentManager
实例,这会引发该异常。
另一个建议是不要使用 onResume()
;而是使用 onCreate()
和 onSaveInstanceState(Bundle outState)
以及某种标志,因为这样您就可以跨 Activity 周期保存数据(除非您的 dialog
只是一个弹出的常量消息,每次用户点击 onResume()
时都会非常烦人,您可能有一些与用户交互的数据,这些数据在意外情况下可能会丢失) .
关于android - 在 Activity#onResume() 中显示 DialogFragment 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266471/