从第一个对话框的 OnClickListener 中创建时,第二个对话框会自动销毁

Second dialog is automatically destroyed when created from within a first dialog's OnClickListener

基本上,我有一个登录屏幕,用户可以在其中输入他们的电子邮件和密码进行登录。在他们提交数据后,我会检查他们是否确认了他们的电子邮件地址。如果没有,我会显示一个带有相应消息的对话框。在该对话框中,我为他们提供了一个中性按钮,用于请求新的确认电子邮件(如果他们还没有收到的话)。如果他们单击该按钮,我想显示另一个对话框,其中包含电子邮件已成功发送的消息。问题是,每当我从第一个对话框的 OnClickListener 中创建并显示第二个对话框时,第二个对话框就会被实例化,但随后会立即被销毁。所以我的问题是,为什么会发生这种情况以及我如何实现这种功能,以便显示的任何片段都将在旋转过程中保留?

NotVerifiedEmailDialog.java(第一个对话):

public class NotVerifiedEmailDialog extends DialogFragment
{
    private static final String TAG = "NotVerifiedEmailDialog";

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.email_not_verified)
            .setMessage(R.string.email_not_verified_message)
            .setPositiveButton(android.R.string.ok, null)
            .setNeutralButton(R.string.request_new_email, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int which)
                {
                    EmailSentDialog dialog = new EmailSentDialog();
                    dialog.show(getChildFragmentManager(), dialog.getMyTag());
                }
            })
            .create();
    }

    public String getMyTag()
    {
        return TAG;
    }
}

EmailSentDialog.java(第二个对话):

public class EmailSentDialog extends DialogFragment
{
    private static final String TAG = "EmailSentDialog";

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.success)
                .setMessage(R.string.email_sent_message)
                .setPositiveButton(android.R.string.ok, null)
                .create();
    }

    public String getMyTag()
    {
        return TAG;
    }
}

尝试将以下变量设为实例变量。您的对话对象可能会被上一个对话破坏。

EmailSentDialog dialog;

如果有人遇到这个问题,解决办法是用getParentFragment().getChildFragmentManager()替换getChildFragmentManager()。前者获得第一个对话框的子片段管理器,由于单击按钮,该对话框将被销毁(这就是为什么第二个对话框立即被销毁,因为它与第一个对话框的子片段管理器相关联),而后者获得父片段的子片段管理器(在我的例子中是 LoginFragment),因此不会立即销毁。