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

时间:2016-05-03 23:31:43

标签: android android-dialogfragment android-dialog

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

答案 0 :(得分:0)

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

EmailSentDialog dialog;

答案 1 :(得分:0)

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