如何使用对话框从Firebase注销

时间:2020-04-01 12:23:28

标签: android firebase android-fragments android-dialog

我正在尝试从我的应用中注销用户。

到目前为止我能做什么?

我可以通过单击按钮退出用户

我想要什么?

当用户按下“退出”按钮时,我想弹出一个对话框,询问用户是否确定,然后从肯定的按钮中退出,然后启动“登录”活动

出了什么问题?

在对话框肯定按钮的单击侦听器中,我编写了退出代码,但由于唱歌代码是异步的,并且在按下肯定按钮后对话框立即关闭,因此当退出onComplete()时运行对话框不存在,因为它已经关闭,所以我得到了错误

java.lang.IllegalStateException: Fragment SignOutDialog{fef4a91 (b8bfbb8c-cdff-4244-9952-81516d1ed736)} not attached to Activity

这是代码

public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    super.onCreateDialog(savedInstanceState);
     return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.sign_out)
            .setMessage(R.string.sure_sign_out)
            .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    signOut();
                }
            }).create();
}

private void signOut(){
  AuthUI.getInstance().signOut(mContext)
          .addOnCompleteListener(new OnCompleteListener<Void>() {
              @Override
              public void onComplete(@NonNull Task<Void> task) {
                  if(task.isSuccessful()) {
                      Intent intent = new Intent(mContext,MainActivity.class);
                      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                      startActivity(intent);
                  }
                  else
                      Toast.makeText(getContext(),"Sign out failed, try again",Toast.LENGTH_LONG).show();
              }
          });
}

我尝试了哪些其他方法

1 我在与对话框相同的片段中显示对话框后,尝试编写退出代码

类似

public void onClick(View v) {
           new SignOutDialog(getActivity()).show(getFragmentManager(),"tag");
           signOut();
          }

但是问题在于对话框也是异步的,因此在显示对话框后,签出代码将执行,并且用户没有机会按下对话框的肯定按钮。

2 我尝试在用于显示对话框的代码所在的片段中编写signout方法,然后尝试从内部对话框的片段的单例实例中调用该方法,因为该片段将在对话框关闭时附加,所以我不会收到上面的错误

类似

public void onClick(DialogInterface dialog, int which) {
                    SettingsFragment.getInstance().signOut();
                    }

但是这种方法给我以下错误

java.lang.NullPointerException: Null context is not permitted.

我不理解该错误,因为在signOut(context)中使用的是与onAttach()中相同的上下文,我还尝试了getActivity()getContext()getConext().getApplicationContext()以及片段在前台,上下文应该有效,但它表示为null。 即使以某种方式起作用,我也不想使用这种方法,因为它不是很干净。

可以有人帮我吗?

1 个答案:

答案 0 :(得分:1)

问题是您使用的是DialogFragment,当对话框消失时,它也DialogFragment也消失了,并且由于DialogFragment死了,它将不会附加到您的活动中,这就是为什么您有这个问题

java.lang.IllegalStateException:片段SignOutDialog {fef4a91 (b8bfbb8c-cdff-4244-9952-81516d1ed736)}未附加到活动

请保持简单,不要使用DialogFragment,只需使用普通的Fragment并在要按下SignOut

的按钮后启动对话框时创建对话框
btn_signout.setOnClickListner { ...
    AlertDialog.Builder(getActivity())
                .setTitle(R.string.sign_out)
                .setMessage(R.string.sure_sign_out)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        signOut();
                    }
                }).create().show();
}

如果要在退出完成后关闭此对话框,请将其创建为AlertDialog的实例,在按钮内构建它,然后在退出完成时使用该Alertdialog将其关闭

相关问题