Как выйти из firebase с помощью диалога - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь выйти из приложения.

Что я могу сделать до сих пор?

Я могу выйти из системы, нажав кнопку

Что я хочу?

Когда пользователь нажимает кнопку выхода, я хочу всплывающее диалоговое окно, которое спрашивает пользователя, уверен ли он в этом, а затем из положительного Кнопка Я хочу выйти, а затем начать действие входа в систему

В чем проблема?

В прослушивателе щелчка положительной кнопки диалога я написал код для выход из системы, но поскольку выделенный код является асинхронным, и диалоговое окно было немедленно закрыто при нажатии положительной кнопки, поэтому при запуске 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(), а фрагмент находится на переднем плане контекст должен быть действительным, но он говорит, что это нуль. Даже если он как-то работает, я не хочу использовать этот подход, потому что он не очень чистый.

Может кто-нибудь, пожалуйста, помогите мне, пожалуйста?

1 Ответ

1 голос
/ 01 апреля 2020

Проблема в том, что вы используете DialogFragment, когда ваш диалог умирает, он также умирает DialogFragment и, так как DialogFragment умирает, он не будет привязан к вашей деятельности, поэтому у вас есть эта проблема

java .lang.IllegalStateException: фрагмент SignOutDialog {fef4a91 (b8bfbb8 c -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, создайте его внутри кнопки, а затем используйте этот alerttdialog, чтобы закрыть его при завершении выхода из системы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...