每当用户输入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/

10-12 03:53