Второе диалоговое окно автоматически уничтожается при создании из 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;
    }
}

2 ответа

  1. Попробуйте сделать следующую переменную в качестве переменной экземпляра. Объект диалогового окна может быть уничтожен предыдущим диалоговым окном.

    EmailSentDialog dialog;
    
  2. В случае, если кто-то столкнулся с этой проблемой, решение заключается в замене getChildFragmentManager()getParentFragment().getChildFragmentManager(). Первый получает дочерний менеджер фрагментов первого диалога, который будет уничтожен из-за нажатия кнопки (поэтому второй диалог уничтожается мгновенно, потому что он привязан к дочернему менеджеру фрагментов первого диалога), в то время как последний получает дочерний менеджер фрагментов родительского фрагмента (в моем случае LoginFragment) и, следовательно, не уничтожается сразу.