基本上,我有一个登录屏幕,用户输入他们的电子邮件和密码进行登录。在他们提交数据后,我会检查他们是否确认了他们的电子邮件地址。如果没有,我会显示一个带有相应消息的对话框。在该对话框中,我向他们提供了一个中性按钮,用于请求新的确认电子邮件,如果他们还没有收到。如果他们点击该按钮,我想显示另一个对话框,其中包含电子邮件已成功发送的消息。问题是每当我在第一个对话框的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;
}
}
答案 0 :(得分:0)
尝试将以下变量作为实例变量。您的对话框对象可能会被前一个对话框破坏。
EmailSentDialog dialog;
答案 1 :(得分:0)
如果有人遇到此问题,解决方法是将getChildFragmentManager()
替换为getParentFragment().getChildFragmentManager()
。前者得到第一个对话框的子片段管理器,由于按钮点击(这就是为什么第二个对话框会立即被销毁,因为它与第一个对话框的子项相关联)会被销毁片段管理器),而后者获取父片段的子片段管理器(在我的情况下,LoginFragment),因此不会立即销毁。