protected virtual void RemoveFragmentsFromBackStack()
 {
     FragmentsBackStack.ForEach(x =>
     {
         UnbindCycle(x.ViewModel);
     });
     FragmentsBackStack.Clear();
 }
        protected virtual void RemoveFragmentFromBackStack(string fragmentName)
        {
            var existCache = FragmentsBackStack.FirstOrDefault(x => x.Key == fragmentName);

            if (existCache != null)
            {
                UnbindCycle(existCache.ViewModel);
                FragmentsBackStack.Remove(existCache);
            }
        }
        protected virtual void RemoveFragmentFromBackStack(MvxFragmentPresentationAttribute fragmentAttribute)
        {
            var fragmentName = FragmentJavaName(fragmentAttribute.ViewType);
            var existCache   = FragmentsBackStack.FirstOrDefault(x => x.Key == fragmentName);

            if (existCache != null)
            {
                UnbindCycle(existCache.ViewModel);
                FragmentsBackStack.Remove(existCache);
            }
        }
        protected override bool TryPerformCloseFragmentTransaction(FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute)
        {
            var fragmentName = FragmentJavaName(fragmentAttribute.ViewType);

            var fragmentTransaction = fragmentManager.BeginTransaction();

            fragmentTransaction.DisallowAddToBackStack();

            PopFragment(fragmentManager, fragmentTransaction, fragmentAttribute, fragmentName, true);

            var newLastCachedFragment = FragmentsBackStack?.LastOrDefault();

            if (newLastCachedFragment != null)
            {
                PushFragment(fragmentManager, fragmentTransaction, null, null, newLastCachedFragment.ViewModel, newLastCachedFragment.Key);
            }

            fragmentTransaction.CommitNow();

            return(true);
        }
        public virtual void MoveBack()
        {
            if (CanPop())
            {
                var cachedFragment = FragmentsBackStack?.LastOrDefault();
                if (cachedFragment != null)
                {
                    var fragmentManager = CurrentFragmentManager;

                    var fragmentTransaction = fragmentManager.BeginTransaction();

                    fragmentTransaction.DisallowAddToBackStack();

                    PopFragment(fragmentManager, fragmentTransaction, DeqeueFragmentAttributeIfExist(cachedFragment.Key), cachedFragment.Key, true);

                    var newLastCachedFragment = FragmentsBackStack?.LastOrDefault();
                    if (newLastCachedFragment != null)
                    {
                        PushFragment(fragmentManager, fragmentTransaction, null, null, newLastCachedFragment.ViewModel, newLastCachedFragment.Key);
                    }

                    fragmentTransaction.CommitNow();
                }
            }
            else
            {
                if ((new Java.Util.Date().Time - LastBackClick.Time) / 1000 < 3)
                {
                    CurrentActivity.FinishAffinity();
                    Process.KillProcess(Process.MyPid());
                }
                else
                {
                    LastBackClick = new Java.Util.Date();
                    (CurrentActivity as ICommonActivity)?.ShowToast("Для выхода из приложения нажмите кнопку повторно");
                }
            }
        }
        public virtual T GetAndClear <T>(string viewModelTag = "singleInstanceCache") where T : IMvxViewModel
        {
            var existCache = FragmentsBackStack.LastOrDefault(x => x.Key == viewModelTag);

            return((T)existCache?.ViewModel);
        }
        public virtual IMvxViewModel GetAndClear(Type viewModelType, string viewModelTag = "singleInstanceCache")
        {
            var existCache = FragmentsBackStack.LastOrDefault(x => x.Key == viewModelTag);

            return(existCache?.ViewModel);
        }
        protected virtual void PopFragment(FragmentManager fragmentManager, FragmentTransaction fragmentTransaction, MvxFragmentPresentationAttribute fragmentAttribute, string fragmentName, bool removeIsNeeded = false, bool forward = false)
        {
            fragmentAttribute = fragmentAttribute ?? DeqeueFragmentAttributeIfExist(fragmentName);

            if (fragmentAttribute != null)
            {
                if (!fragmentAttribute.EnterAnimation.Equals(int.MinValue) && !fragmentAttribute.ExitAnimation.Equals(int.MinValue))
                {
                    if (!fragmentAttribute.PopEnterAnimation.Equals(int.MinValue) && !fragmentAttribute.PopExitAnimation.Equals(int.MinValue))
                    {
                        fragmentTransaction.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation, fragmentAttribute.PopEnterAnimation, fragmentAttribute.PopExitAnimation);
                    }
                    else
                    {
                        fragmentTransaction.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation);
                    }
                }

                if (fragmentAttribute.TransitionStyle != int.MinValue)
                {
                    fragmentTransaction.SetTransitionStyle(fragmentAttribute.TransitionStyle);
                }
            }

            if ((FragmentsBackStack.LastOrDefault(x => x.Key == fragmentName)?.ViewModel as IBaseViewModel)?.VmNavigationType == NavigationType.PresentModal)
            {
                lock (this)
                {
                    _presentedModalFragments--;
                }
            }

            var oldFragment = fragmentManager.FindFragmentByTag(fragmentName);

            if (oldFragment != null)
            {
                if (!oldFragment.IsDetached)
                {
                    if (removeIsNeeded)
                    {
                        RemoveFragmentFromBackStack(fragmentName);

                        fragmentTransaction.Remove(oldFragment);
                    }
                    else
                    {
                        fragmentTransaction.Detach(oldFragment);
                    }
                }
                else if (removeIsNeeded)
                {
                    RemoveFragmentFromBackStack(fragmentName);

                    fragmentTransaction.Remove(oldFragment);
                }

                if (!forward)
                {
                    OnFragmentPopped(fragmentTransaction, oldFragment, null);
                }
            }
        }
 protected virtual void AddFragmentToBackStack(ViewModelBundleCache bundle)
 {
     FragmentsBackStack.Add(bundle);
 }