android - 在 Activity#onResume() 中显示 DialogFragment 的正确方法

标签 android android-fragments android-dialogfragment

每次用户进入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() 调用的包装器,它可能会检查 dialogsetRetainInstance 是否为 true,如果为 false,则 DialogFragment code> 实例再次添加到同一个 FragmentManager 实例,这会引发该异常。

另一个建议是不要使用 onResume() ;而是使用 onCreate()onSaveInstanceState(Bundle outState) 以及某种标志,因为这样您就可以跨 Activity 周期保存数据(除非您的 dialog 只是一个弹出的常量消息,每次用户点击 onResume() 时都会非常烦人,您可能有一些与用户交互的数据,这些数据在意外情况下可能会丢失) .

关于android - 在 Activity#onResume() 中显示 DialogFragment 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266471/

相关文章:

android - getArgument() 返回 NULL

android - 使用 TabLayout Viewpager 时出现 "Already managing a GoogleApiClient with id 0"异常

java - 将数据从 RecyclerView 发送到 Fragment

android - 如何在创建 DialogFragment 时关闭 Activity?

Android 无法添加窗口报错

Android LogCat sqlite语法错误含义

android - 如何在 Maven 项目的 POM 文件中为 gmail 发件人添加 additionnal.jar?

java - 关闭 InputStream

android - 使用 DialogFragment 的对话框未正确显示

android - 从自定义基本适配器>getView [包含IMG]单击按钮启动对话框 fragment