如何使用对话框退出 firebase
How Sign out from firebase with dialog
我正在尝试从我的应用中注销用户。
到目前为止我能做什么?
我可以通过单击按钮注销用户
我想要什么?
当用户按下注销按钮时,我想弹出对话框询问用户是否确定,然后从肯定按钮我想注销,然后开始登录 activity
问题是什么?
在对话框的肯定按钮的点击侦听器中,我编写了用于注销的代码,但是由于唱出代码是异步的,并且对话框在按下肯定按钮时立即关闭,所以当注销时 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 我尝试在显示对话框的代码所在的片段中编写注销方法,然后尝试从来自内部对话框的片段,因为该片段将在对话框关闭时附加,所以我不会得到上面的错误
类似于
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()
片段在前台,上下文应该是有效的,但它说它是空的。
即使它以某种方式起作用,我也不想使用这种方法,因为它不是很干净。
有人可以帮帮我吗?
问题是您使用的是 DialogFragment
,当您的对话终止时,它也会终止 DialogFragment
,并且由于 DialogFragment
终止,它不会附加到您的 activity,这就是你遇到这个问题的原因
java.lang.IllegalStateException: Fragment SignOutDialog{fef4a91
(b8bfbb8c-cdff-4244-9952-81516d1ed736)} not attached to Activity
保持简单,不要使用 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 的实例,将其构建在按钮内,然后使用该警报对话框在注销完成后将其关闭
我正在尝试从我的应用中注销用户。
到目前为止我能做什么?
我可以通过单击按钮注销用户
我想要什么?
当用户按下注销按钮时,我想弹出对话框询问用户是否确定,然后从肯定按钮我想注销,然后开始登录 activity
问题是什么?
在对话框的肯定按钮的点击侦听器中,我编写了用于注销的代码,但是由于唱出代码是异步的,并且对话框在按下肯定按钮时立即关闭,所以当注销时 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 我尝试在显示对话框的代码所在的片段中编写注销方法,然后尝试从来自内部对话框的片段,因为该片段将在对话框关闭时附加,所以我不会得到上面的错误
类似于
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()
片段在前台,上下文应该是有效的,但它说它是空的。
即使它以某种方式起作用,我也不想使用这种方法,因为它不是很干净。
有人可以帮帮我吗?
问题是您使用的是 DialogFragment
,当您的对话终止时,它也会终止 DialogFragment
,并且由于 DialogFragment
终止,它不会附加到您的 activity,这就是你遇到这个问题的原因
java.lang.IllegalStateException: Fragment SignOutDialog{fef4a91 (b8bfbb8c-cdff-4244-9952-81516d1ed736)} not attached to Activity
保持简单,不要使用 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 的实例,将其构建在按钮内,然后使用该警报对话框在注销完成后将其关闭