public static void EnsureBindingContextIsSet(this IMvxFragmentView fragment) { var actualFragment = fragment.ToFragment(); if (actualFragment == null) { throw new MvxException($"{nameof(EnsureBindingContextIsSet)} called on an {nameof(IMvxFragmentView)} which is not an Android Fragment: {fragment}"); } if (fragment.BindingContext == null) { fragment.BindingContext = new MvxAndroidBindingContext(actualFragment.Activity, new MvxSimpleLayoutInflaterHolder( actualFragment.Activity.LayoutInflater), fragment.DataContext); } else { var androidContext = fragment.BindingContext as IMvxAndroidBindingContext; if (androidContext != null) { androidContext.LayoutInflaterHolder = new MvxSimpleLayoutInflaterHolder(actualFragment.Activity.LayoutInflater); } } }
protected virtual void PerformShowFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute attribute, MvxViewModelRequest request) { var fragmentName = FragmentJavaName(attribute.ViewType); IMvxFragmentView fragment = null; if (attribute.IsCacheableFragment) { fragment = (IMvxFragmentView)fragmentManager.FindFragmentByTag(fragmentName); } fragment = fragment ?? CreateFragment(attribute, fragmentName); var fragmentView = fragment.ToFragment(); // MvxNavigationService provides an already instantiated ViewModel here, // therefore just assign it if (request is MvxViewModelInstanceRequest instanceRequest) { fragment.ViewModel = instanceRequest.ViewModelInstance; } else { 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); if (attribute.AddToBackStack == true) { ft.AddToBackStack(fragmentName); } OnFragmentChanging(ft, fragmentView, attribute); ft.Replace(attribute.FragmentContentId, (Fragment)fragment, fragmentName); ft.CommitAllowingStateLoss(); OnFragmentChanged(ft, fragmentView, attribute); }
public static void OnCreate(this IMvxFragmentView fragmentView, IMvxBundle bundle, MvxViewModelRequest request = null) { if (fragmentView.ViewModel != null) { //TODO call MvxViewModelLoader.Reload when it's added in MvvmCross, tracked by #1165 //until then, we're going to re-run the viewmodel lifecycle here. Android.Views.MvxFragmentExtensions.RunViewModelLifecycle(fragmentView.ViewModel, bundle, request); return; } var fragment = fragmentView.ToFragment(); if (fragment == null) { throw new MvxException($"{nameof(OnCreate)} called on an {nameof(IMvxFragmentView)} which is not an Android Fragment: {fragmentView}"); } // as it is called during onCreate it is safe to assume that fragment has Activity attached. var viewModelType = fragmentView.FindAssociatedViewModelType(fragment.Activity.GetType()); var view = fragmentView as IMvxView; var cache = Mvx.Resolve <IMvxMultipleViewModelCache>(); var cached = cache.GetAndClear(viewModelType, fragmentView.UniqueImmutableCacheTag); view.OnViewCreate(() => cached ?? fragmentView.LoadViewModel(bundle, fragment.Activity.GetType(), request)); }
public static void OnCreate(this IMvxFragmentView fragmentView, IMvxBundle bundle, MvxViewModelRequest request = null) { var cache = Mvx.IoCProvider.Resolve <IMvxMultipleViewModelCache>(); if (fragmentView.ViewModel != null) { // check if ViewModel instance was cached. If so, clear it and ignore previous instance cache.GetAndClear(fragmentView.ViewModel.GetType(), fragmentView.UniqueImmutableCacheTag); return; } var fragment = fragmentView.ToFragment(); if (fragment == null) { throw new MvxException($"{nameof(OnCreate)} called on an {nameof(IMvxFragmentView)} which is not an Android Fragment: {fragmentView}"); } // as it is called during onCreate it is safe to assume that fragment has Activity attached. var viewModelType = fragmentView.FindAssociatedViewModelType(fragment.Activity.GetType()); var view = fragmentView as IMvxView; var cached = cache.GetAndClear(viewModelType, fragmentView.UniqueImmutableCacheTag); view.OnViewCreate(() => cached ?? fragmentView.LoadViewModel(bundle, fragment.Activity.GetType(), request)); }
public static void RegisterFragmentViewToCacheIfNeeded(this IMvxFragmentView fragmentView, Type fragmentParentActivityType) { Fragment representedFragment = fragmentView.ToFragment(); if (representedFragment == null) { throw new InvalidOperationException($"Represented type: {fragmentView.GetType()} is not a Fragment!"); } var fragmentParentActivtiy = representedFragment.Activity; if (fragmentParentActivtiy == null) { throw new InvalidOperationException("Something wrong happend, fragment has no activity attached during registration!"); } IFragmentCacheableActivity cacheableActivity = fragmentParentActivtiy as IFragmentCacheableActivity; if (cacheableActivity == null) { throw new InvalidOperationException($"Fragment has activity attached but it does not implement {nameof(IFragmentCacheableActivity)} ! Cannot register fragment to cache!"); } if (string.IsNullOrEmpty(fragmentView.UniqueImmutableCacheTag)) { throw new InvalidOperationException("Contract failed - Fragment tag is null! Fragment tags are not set by default, you should add tag during FragmentTransaction or override UniqueImmutableCacheTag in your Fragment class."); } var fragmentCacheConfiguration = cacheableActivity.FragmentCacheConfiguration; fragmentCacheConfiguration.RegisterFragmentToCache(fragmentView.UniqueImmutableCacheTag, fragmentView.GetType(), fragmentView.FindAssociatedViewModelType(fragmentParentActivityType)); }
public static void EnsureSetupInitialized(this IMvxFragmentView fragmentView) { var fragment = fragmentView.ToFragment(); var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(fragment.Activity.ApplicationContext); setupSingleton.EnsureInitialized(); }
public static void EnsureSetupInitialized(this IMvxFragmentView fragmentView) { var fragment = fragmentView.ToFragment(); if (fragment == null) { throw new MvxException($"{nameof(EnsureSetupInitialized)} called on an {nameof(IMvxFragmentView)} which is not an Android Fragment: {fragmentView}"); } var setup = MvxAndroidSetupSingleton.EnsureSingletonAvailable(fragment.Activity.ApplicationContext); setup.EnsureInitialized(); }
public static void EnsureSetupInitialized(this IMvxFragmentView fragmentView) { var fragment = fragmentView.ToFragment(); if (fragment == null) { throw new MvxException("EnsureSetupInitialized called on an IMvxFragmentView which is not an Android Fragment: {0}", fragmentView); } var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(fragment.Activity.ApplicationContext); setupSingleton.EnsureInitialized(); }
public static void EnsureBindingContextIsSet(this IMvxFragmentView fragment, LayoutInflater inflater) { var actualFragment = fragment.ToFragment(); if (fragment.BindingContext == null) { fragment.BindingContext = new MvxAndroidBindingContext(actualFragment.Activity, new MvxSimpleLayoutInflaterHolder(inflater), fragment.DataContext); } else { var androidContext = fragment.BindingContext as IMvxAndroidBindingContext; if (androidContext != null) { androidContext.LayoutInflaterHolder = new MvxSimpleLayoutInflaterHolder(inflater); } } }
protected virtual void PerformShowFragmentTransaction( FragmentManager fragmentManager, MvxFragmentPresentationAttribute attribute, MvxViewModelRequest request) { var fragmentName = FragmentJavaName(attribute.ViewType); IMvxFragmentView fragment = null; if (attribute.IsCacheableFragment) { fragment = (IMvxFragmentView)fragmentManager.FindFragmentByTag(fragmentName); } fragment = fragment ?? CreateFragment(attribute, fragmentName); // MvxNavigationService provides an already instantiated ViewModel here, // therefore just assign it if (request is MvxViewModelInstanceRequest instanceRequest) { fragment.ViewModel = instanceRequest.ViewModelInstance; } else { var bundle = new Bundle(); var serializedRequest = NavigationSerializer.Serializer.SerializeObject(request); bundle.PutString(ViewModelRequestBundleKey, serializedRequest); var fragmentView = fragment.ToFragment(); if (fragmentView != null) { if (fragmentView.Arguments == null) { fragmentView.Arguments = bundle; } else { fragmentView.Arguments.Clear(); fragmentView.Arguments.PutAll(bundle); } } } var ft = fragmentManager.BeginTransaction(); if (attribute.SharedElements != null) { foreach (var item in attribute.SharedElements) { string name = item.Key; if (string.IsNullOrEmpty(name)) { name = ViewCompat.GetTransitionName(item.Value); } ft.AddSharedElement(item.Value, name); } } if (!attribute.EnterAnimation.Equals(int.MinValue) && !attribute.ExitAnimation.Equals(int.MinValue)) { if (!attribute.PopEnterAnimation.Equals(int.MinValue) && !attribute.PopExitAnimation.Equals(int.MinValue)) { ft.SetCustomAnimations(attribute.EnterAnimation, attribute.ExitAnimation, attribute.PopEnterAnimation, attribute.PopExitAnimation); } else { ft.SetCustomAnimations(attribute.EnterAnimation, attribute.ExitAnimation); } } if (attribute.TransitionStyle != int.MinValue) { ft.SetTransitionStyle(attribute.TransitionStyle); } if (attribute.AddToBackStack == true) { ft.AddToBackStack(fragmentName); } ft.Replace(attribute.FragmentContentId, (Fragment)fragment, fragmentName); ft.CommitAllowingStateLoss(); }