我正在尝试从我的应用中注销用户。
到目前为止我能做什么?
我可以通过单击按钮退出用户
我想要什么?
当用户按下“退出”按钮时,我想弹出一个对话框,询问用户是否确定,然后从肯定的按钮中退出,然后启动“登录”活动
出了什么问题?
在对话框肯定按钮的单击侦听器中,我编写了退出代码,但由于唱歌代码是异步的,并且在按下肯定按钮后对话框立即关闭,因此当退出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。
即使以某种方式起作用,我也不想使用这种方法,因为它不是很干净。
可以有人帮我吗?
答案 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将其关闭