protected virtual void PerformShowFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute attribute, MvxViewModelRequest request) { var fragmentName = attribute.ViewType.FragmentJavaName(); IMvxFragmentView fragment = null; if (attribute.IsCacheableFragment) { fragment = (IMvxFragmentView)fragmentManager.FindFragmentByTag(fragmentName); } fragment = fragment ?? CreateFragment(fragmentManager, attribute, attribute.ViewType); var fragmentView = fragment.ToFragment(); // MvxNavigationService provides an already instantiated ViewModel here if (request is MvxViewModelInstanceRequest instanceRequest) { fragment.ViewModel = instanceRequest.ViewModelInstance; } // save MvxViewModelRequest in the Fragment's Arguments var bundle = new Bundle(); var serializedRequest = NavigationSerializer.Serializer.SerializeObject(request); bundle.PutString(ViewModelRequestBundleKey, serializedRequest); if (fragmentView != null) { if (fragmentView.Arguments == null) { fragmentView.Arguments = bundle; } else { fragmentView.Arguments.Clear(); fragmentView.Arguments.PutAll(bundle); } } var ft = fragmentManager.BeginTransaction(); OnBeforeFragmentChanging(ft, fragmentView, attribute, request); if (attribute.AddToBackStack) { ft.AddToBackStack(fragmentName); } OnFragmentChanging(ft, fragmentView, attribute, request); ft.Replace(attribute.FragmentContentId, fragmentView, fragmentName); ft.CommitAllowingStateLoss(); OnFragmentChanged(ft, fragmentView, attribute, request); }
protected virtual bool TryPerformCloseFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute) { try { var fragmentName = fragmentAttribute.ViewType.FragmentJavaName(); if (fragmentManager.BackStackEntryCount > 0) { var popBackStackFragmentName = fragmentAttribute.PopBackStackImmediateName?.Trim() == "" ? fragmentName : fragmentAttribute.PopBackStackImmediateName; fragmentManager.PopBackStackImmediate(popBackStackFragmentName, (int)fragmentAttribute.PopBackStackImmediateFlag.ToNativePopBackStackFlags()); OnFragmentPopped(null, null, fragmentAttribute); return(true); } else if (CurrentFragmentManager.FindFragmentByTag(fragmentName) != null) { var ft = fragmentManager.BeginTransaction(); var fragment = fragmentManager.FindFragmentByTag(fragmentName); if (!fragmentAttribute.EnterAnimation.Equals(int.MinValue) && !fragmentAttribute.ExitAnimation.Equals(int.MinValue)) { if (!fragmentAttribute.PopEnterAnimation.Equals(int.MinValue) && !fragmentAttribute.PopExitAnimation.Equals(int.MinValue)) { ft.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation, fragmentAttribute.PopEnterAnimation, fragmentAttribute.PopExitAnimation); } else { ft.SetCustomAnimations(fragmentAttribute.EnterAnimation, fragmentAttribute.ExitAnimation); } } if (fragmentAttribute.TransitionStyle != int.MinValue) { ft.SetTransitionStyle(fragmentAttribute.TransitionStyle); } ft.Remove(fragment); ft.CommitAllowingStateLoss(); OnFragmentPopped(ft, fragment, fragmentAttribute); return(true); } } catch (System.Exception ex) { MvxLog.Instance.Error("Cannot close fragment transaction", ex); return(false); } return(false); }
protected virtual Task <bool> CloseViewPagerFragment(IMvxViewModel viewModel, MvxViewPagerFragmentPresentationAttribute attribute) { ViewPager viewPager = null; FragmentManager fragmentManager = null; if (attribute?.FragmentHostViewType != null) { var fragment = GetFragmentByViewType(attribute.FragmentHostViewType); if (fragment == null) { throw new MvxException("Fragment not found", attribute.FragmentHostViewType.Name); } viewPager = fragment.View.FindViewById <ViewPager>(attribute.ViewPagerResourceId); fragmentManager = fragment.ChildFragmentManager; } else { viewPager = CurrentActivity.FindViewById <ViewPager>(attribute.ViewPagerResourceId); fragmentManager = CurrentFragmentManager; } if (viewPager?.Adapter is MvxCachingFragmentStatePagerAdapter adapter) { var ft = fragmentManager.BeginTransaction(); var fragmentInfo = FindFragmentInfoFromAttribute(attribute, adapter); var fragment = fragmentManager.FindFragmentByTag(fragmentInfo.Tag); adapter.FragmentsInfo.Remove(fragmentInfo); ft.Remove(fragment); ft.CommitAllowingStateLoss(); adapter.NotifyDataSetChanged(); OnFragmentPopped(ft, fragment, attribute); return(Task.FromResult(true)); } return(Task.FromResult(false)); }
protected virtual bool TryPerformCloseFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute) { ValidateArguments(fragmentAttribute); if (fragmentManager == null) { throw new ArgumentNullException(nameof(fragmentManager)); } try { var fragmentName = fragmentAttribute.Tag ?? fragmentAttribute.ViewType.FragmentJavaName(); if (fragmentManager.BackStackEntryCount > 0) { PopOnBackstackEntries(fragmentName, fragmentManager, fragmentAttribute); return(true); } Fragment fragmentToPop = fragmentManager.FindFragmentByTag(fragmentName); if (fragmentToPop != null) { PopFragment(fragmentManager, fragmentAttribute, fragmentToPop); return(true); } } #pragma warning disable CA1031 // Do not catch general exception types catch (System.Exception ex) #pragma warning restore CA1031 // Do not catch general exception types { _logger.Value?.Log(LogLevel.Error, ex, "Cannot close fragment transaction"); return(false); } return(false); }
protected virtual void PerformShowFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute attribute, MvxViewModelRequest request) { ValidateArguments(attribute, request); if (fragmentManager == null) { throw new ArgumentNullException(nameof(fragmentManager)); } var fragmentName = attribute.Tag ?? attribute.ViewType.FragmentJavaName(); IMvxFragmentView?fragmentView = null; if (attribute.IsCacheableFragment) { fragmentView = (IMvxFragmentView)fragmentManager.FindFragmentByTag(fragmentName); } if (fragmentView == null && attribute.ViewType != null) { fragmentView = CreateFragment(fragmentManager, attribute, attribute.ViewType); } var fragment = fragmentView.ToFragment(); if (fragment == null) { throw new MvxException($"Fragment {fragmentName} is null. Cannot perform Fragment Transaction."); } // MvxNavigationService provides an already instantiated ViewModel here if (request is MvxViewModelInstanceRequest instanceRequest) { fragmentView !.ViewModel = instanceRequest.ViewModelInstance; } // save MvxViewModelRequest in the Fragment's Arguments #pragma warning disable CA2000 // Dispose objects before losing scope var bundle = new Bundle(); #pragma warning restore CA2000 // Dispose objects before losing scope var serializedRequest = NavigationSerializer.Serializer.SerializeObject(request); bundle.PutString(ViewModelRequestBundleKey, serializedRequest); if (fragment.Arguments == null) { fragment.Arguments = bundle; } else { fragment.Arguments.Clear(); fragment.Arguments.PutAll(bundle); } var ft = fragmentManager.BeginTransaction(); OnBeforeFragmentChanging(ft, fragment, attribute, request); if (attribute.AddToBackStack) { ft.AddToBackStack(fragmentName); } OnFragmentChanging(ft, fragment, attribute, request); if (attribute.AddFragment && fragment.IsAdded) { ft.Show(fragment); } else if (attribute.AddFragment) { ft.Add(attribute.FragmentContentId, fragment, fragmentName); } else { ft.Replace(attribute.FragmentContentId, fragment, fragmentName); } ft.CommitAllowingStateLoss(); OnFragmentChanged(ft, fragment, attribute, request); }