每当用户输入DialogFragment
时,我都需要显示一个Activity
,所以最好的回调方法是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可见并在屏幕旋转(方向更改)之间工作时,我遇到了完全相同的异常和消息。您的片段来自支持库吗?
就我而言,我使用的是支持库,对dialog.show()
的调用在活动的onCreate()
中。似乎已经解决了该问题的是此处介绍的解决方法:
https://stackoverflow.com/a/14016339/3577211
基本上是将setRetainInstance(true)
放在DialogFragment的onCreate()
中。第二部分,即覆盖其onDestroy
,是我设法使DialogFragment在屏幕旋转期间不消失(并且在再次旋转时返回)的唯一方法,即使他们说最新的支持库版本已解决了问题其中的一个(也许我把这里的罐子弄乱了)。
您没有说明是始终获得异常还是仅在首次创建活动时起作用。但是我想发生的是dialog.show()
实际上是getFragmentManager().add()
调用的包装,它可能检查setRetainInstance
对于true
是否为dialog
,如果为false
,则为DialogFragment
实例再次添加到同一FragmentManager
实例,该实例抛出该异常。
另一个建议是不要为此使用onResume()
。而是使用带有某种标志的onCreate()
和onSaveInstanceState(Bundle outState)
,因为那样可以保存活动周期中的数据(除非dialog
只是一个弹出常量消息,每次用户点击时都会令人讨厌onResume()
,您可能有一些与用户进行交互的数据,这些数据在意外情况下可能会丢失)。
关于android - 在Activity#onResume()上显示DialogFragment的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24266471/