Как избежать потери экземпляра фрагмента - PullRequest
1 голос
/ 16 июня 2020

У меня проблема с тем, что я не могу закрыть всплывающее окно в моем Android приложении (Xamarin. Android). Вероятно, это связано со странным поведением ОС Device Android. Я сталкиваюсь с этой проблемой, только когда я подключаю устройство (Honeywell CN80 Android OS 8) к подставке для зарядки docker. Если у него есть всплывающее окно / фрагмент, и если устройство подключено к docker, оно вызывает Черный экран с просто свиданием в приложении. Как показано ниже: Экран после подключения к зарядной подставке

   //BasePopUp
   // Under  public abstract class BasePopup : DialogFragment, IDialogInterfaceOnKeyListener
 public override void OnDismiss(IDialogInterface dialog)
        {
            base.OnDismiss(dialog);
            if (null != ViewModel)
            {
                ViewModel.OnViewDisapper();
            }
        }

        public override void OnPause()
        {
            base.OnPause();
          //  CurrentPopup = this;          
        }

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            BlissBoldFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-bold.ttf");
            BlissHeavyFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-heavy.ttf");
            BlissRegularFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-regular.ttf");
            if (null != ViewModel)
            {
                ViewModel.OnViewCreated(null);
            }
        }

        public override void OnActivityCreated(Bundle savedInstanceState)
        {
            base.OnActivityCreated(savedInstanceState);
            CurrentPopup = this;
            Dialog.SetOnKeyListener(CurrentPopup);
        }

Момент подключения к зарядке называется серией методов жизненного цикла Fragment -> OnPause -> OnCreate -> OnActivityCreated -> OnPause -> OnDismiss My Activity также создается заново.

Когда я помещаю приложение в фоновый режим или блокирую экран нажатием кнопки питания, я не сталкиваюсь с этой проблемой. Вызываемые события -> OnPause

Как мне избежать этого поведения, когда я подключаю устройство к зарядной подставке, так как такое поведение портит экземпляр Fragment.

 public class AppCompatDialogService : IDialogService
    {

        private static AlertDialogInfo CreateDialog(string content, string title, string okText = null, string cancelText = null, Action<bool> afterHideCallbackWithResponse = null)
        {
            var tcs = new TaskCompletionSource<bool>();
            var builder = new AlertDialog.Builder(BaseAppCompatActivity.CurrentActivity);
            builder.SetMessage(content);
                // SOme Logic

            builder.SetOnDismissListener(new OnDismissListener(() =>
            {
                tcs.TrySetResult(false);
                if (afterHideCallbackWithResponse == null)
                    return;
                afterHideCallbackWithResponse(false);
            }));

            dialog = builder.Create();

            return new AlertDialogInfo
            {
                Dialog = dialog,
                Tcs = tcs
            };
        }

        private struct AlertDialogInfo
        {
            public AlertDialog Dialog;
            public TaskCompletionSource<bool> Tcs;
        }

        private sealed class OnDismissListener : Java.Lang.Object, IDialogInterfaceOnDismissListener
        {
            private readonly Action _action;

            public OnDismissListener(Action action)
            {
                _action = action;
            }

            public void OnDismiss(IDialogInterface dialog)
            {
                _action();
            }
        }
    }

public void Dismiss(string popupKey)
        {
            if(BaseAppCompatActivity.CurrentActivity != null)
            {
                BaseAppCompatActivity.CurrentActivity.RunOnUiThread(() =>
                {
                    if (_popupHeirarchy.TryGetValue(popupKey, out BasePopup currentPopup))

                        if (null != currentPopup)
                        {
                            try
                            {
                                currentPopup.DismissAllowingStateLoss();
                            }
                            catch (Exception)
                            {
                                //
                            }
                        }
                    }
                });
            }

        }

// From PopUpViewmodel
private void OkButtonClickedHandler()
{
    PopupNavigationService.Dismiss(ViewModelLocator.KEY_POPUP_ERROR);

    // Trying to close the "Relocation Success" popup, to clear existing ack popup instances
    PopupNavigationService.Dismiss(ViewModelLocator.KEY_POPUP_RELOCATION_STATUS);

    if (OkClickHandler != null)
    {
        OkClickHandler?.Invoke(null, new EventArgs());
    }

    ErrorDialogEventArg.IsPopUpDismissed = true;
    ErrorDialogHandler(this, ErrorDialogEventArg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...