从第一个对话框的 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),因此不会立即销毁。
基本上,我有一个登录屏幕,用户可以在其中输入他们的电子邮件和密码进行登录。在他们提交数据后,我会检查他们是否确认了他们的电子邮件地址。如果没有,我会显示一个带有相应消息的对话框。在该对话框中,我为他们提供了一个中性按钮,用于请求新的确认电子邮件(如果他们还没有收到的话)。如果他们单击该按钮,我想显示另一个对话框,其中包含电子邮件已成功发送的消息。问题是,每当我从第一个对话框的 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),因此不会立即销毁。