void RemovePage(Page page) { if (!_isAttachedToWindow) { PushCurrentPages(); } Fragment fragment = GetPageFragment(page); if (fragment == null) { return; } #if DEBUG // Enables logging of moveToState operations to logcat #pragma warning disable CS0618 // Type or member is obsolete FragmentManager.EnableDebugLogging(true); #pragma warning restore CS0618 // Type or member is obsolete #endif // Go ahead and take care of the fragment bookkeeping for the page being removed FragmentTransaction transaction = FragmentManager.BeginTransactionEx(); transaction.RemoveEx(fragment); transaction.CommitAllowingStateLossEx(); // And remove the fragment from our own stack _fragmentStack.Remove(fragment); PostDelayed(() => UpdateToolbar(), 10); }
void AddTransitionTimer(TaskCompletionSource <bool> tcs, Fragment fragment, FragmentManager fragmentManager, IReadOnlyCollection <Fragment> fragmentsToRemove, int duration, bool shouldUpdateToolbar) { Device.StartTimer(TimeSpan.FromMilliseconds(duration), () => { tcs.TrySetResult(true); Current?.SendAppearing(); if (shouldUpdateToolbar) { UpdateToolbar(); } if (fragmentsToRemove.Count > 0) { FragmentTransaction fragmentTransaction = fragmentManager.BeginTransactionEx(); foreach (Fragment frag in fragmentsToRemove) { fragmentTransaction.RemoveEx(frag); } fragmentTransaction.CommitAllowingStateLossEx(); } return(false); }); }
void SetupUserInterface() { activity = this.Context as Activity; view = activity.LayoutInflater.Inflate(Resource.Layout.AdvancedViewerLayout, this, false); mDocumentView = view.FindViewById <DocumentView>(Resource.Id.document_view); var context = this.Context; FragmentManager childManager = null; if (context is FragmentActivity) { var activity = context as FragmentActivity; var manager = activity.SupportFragmentManager; var fragments = manager.Fragments; if (fragments.Count > 0) { childManager = fragments[0].ChildFragmentManager; } if (childManager != null) { mDocumentView.OpenDocument(GetFile(), "", GetConfig(), childManager); } } }
protected virtual IMvxFragmentView CreateFragment( FragmentManager fragmentManager, MvxBasePresentationAttribute attribute, Type fragmentType) { ValidateArguments(attribute); if (fragmentManager == null) { throw new ArgumentNullException(nameof(fragmentManager)); } if (fragmentType == null) { throw new ArgumentNullException(nameof(fragmentType)); } try { var fragmentClass = Class.FromType(fragmentType); var fragment = (IMvxFragmentView)fragmentManager.FragmentFactory.Instantiate( fragmentClass.ClassLoader, fragmentClass.Name); return(fragment); } catch (System.Exception ex) { _logger.Value?.Log(LogLevel.Error, ex, "Cannot create Fragment {fragmentName}", fragmentType.Name); throw new MvxException(ex, $"Cannot create Fragment '{fragmentType.Name}'"); } }
protected virtual void OnNavigationViewFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, NavigationViewFragment navHostPageFragment) { if (IsInitialNavigation) { NavigationFinished(NavigationView); } }
public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f) { if (f is NavigationViewFragment pf) { _stackNavigationManager.OnNavigationViewFragmentResumed(fm, pf); } AToolbar?nativeToolbar = null; IToolbar?toolbar = null; if (_stackNavigationManager.NavigationView?.Toolbar is IToolbar tb && tb?.Handler?.NativeView is AToolbar ntb) { nativeToolbar = ntb; toolbar = tb; } // Wire up the toolbar to the currently made visible Fragment var controller = NavHostFragment.FindNavController(f); var appbarConfigBuilder = new AppBarConfiguration .Builder(_stackNavigationManager.NavGraph); if (nativeToolbar != null && toolbar != null && toolbar.Handler?.MauiContext != null) { if (toolbar.Handler is ToolbarHandler th) { th.SetupWithNavController(controller, _stackNavigationManager); } } }
private void PopFragment(FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute, Fragment fragmentToPop) { var ft = fragmentManager.BeginTransaction(); 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(fragmentToPop); ft.CommitAllowingStateLoss(); OnFragmentPopped(ft, fragmentToPop, fragmentAttribute); }
protected override void Dispose(bool disposing) { if (_disposed) { return; } _disposed = true; if (disposing) { if (_currentFragment != null && !FragmentManager.IsDestroyed) { FragmentTransaction transaction = FragmentManager.BeginTransactionEx(); transaction.RemoveEx(_currentFragment); transaction.SetTransitionEx((int)FragmentTransit.None); transaction.CommitAllowingStateLossEx(); FragmentManager.ExecutePendingTransactionsEx(); _currentFragment = null; } _parent = null; _pageContainer = null; _fragmentManager = null; RemoveAllViews(); DisposeChildRenderers(); } base.Dispose(disposing); }
public void SetFragmentManager(FragmentManager fragmentManager) { if (_fragmentManager == null) { _fragmentManager = fragmentManager; } }
protected override void OnNavigationViewFragmentResumed(FragmentManager fm, NavigationViewFragment navHostPageFragment) { base.OnNavigationViewFragmentResumed(fm, navHostPageFragment); // This appears to be the best place to update the toolbar so that the tinting works // Any early and the tinting will be replaced by the native tinting UpdateToolbar(); }
protected virtual Fragment FindFragmentInChildren(string fragmentName, FragmentManager fragManager) { if (fragManager == null) { return(null); } if (fragManager.BackStackEntryCount == 0) { return(null); } for (int i = 0; i < fragManager.BackStackEntryCount; i++) { var parentFrag = fragManager.FindFragmentById(fragManager.GetBackStackEntryAt(i).Id); //let's try again finding it var frag = parentFrag?.ChildFragmentManager?.FindFragmentByTag(fragmentName); if (frag == null) { //reloop for other fragments frag = FindFragmentInChildren(fragmentName, parentFrag?.ChildFragmentManager); } //if we found the frag lets return it! if (frag != null) { return(frag); } } return(null); }
void IManageFragments.SetFragmentManager(FragmentManager childFragmentManager) { if (_fragmentManager == null) { _fragmentManager = childFragmentManager; } }
void RemovePage(Page page) { if (!_isAttachedToWindow) { PushCurrentPages(); } Fragment fragment = GetPageFragment(page); if (fragment == null) { return; } #if DEBUG // Enables logging of moveToState operations to logcat FragmentManager.EnableDebugLogging(true); #endif // Go ahead and take care of the fragment bookkeeping for the page being removed FragmentTransaction transaction = FragmentManager.BeginTransactionEx(); transaction.RemoveEx(fragment); transaction.CommitAllowingStateLossEx(); // And remove the fragment from our own stack _fragmentStack.Remove(fragment); Device.StartTimer(TimeSpan.FromMilliseconds(10), () => { UpdateToolbar(); return(false); }); }
public PlaygroundBottomNavigationComponent( Context context, BottomTabsPageViewModel viewModel, FragmentManager fragmentManager) : base(viewModel, fragmentManager) { _context = context; }
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); }
// Fragments are always destroyed if they aren't visible // The Handler/PlatformView associated with the visible IView remain intact // The performance hit of destorying/recreating fragments should be negligible // Hopefully this behavior survives implementation // This will need to be tested with Maps and WebViews to make sure they behave efficiently // being removed and then added back to a different Fragment // // I'm firing NavigationFinished from here instead of FragmentAnimationFinished because // this event appears to fire slightly after `FragmentAnimationFinished` and it also fires // if we aren't using animations protected virtual void OnNavigationViewFragmentDestroyed(AndroidX.Fragment.App.FragmentManager fm, NavigationViewFragment navHostPageFragment) { _ = NavigationView ?? throw new InvalidOperationException($"NavigationView cannot be null"); if (IsNavigating) { NavigationFinished(NavigationView); } }
public override void OnFragmentCreated(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f, Bundle savedInstanceState) { base.OnFragmentCreated(fm, f, savedInstanceState); // This wires up the hardware back button to this fragment f.RequireActivity() .OnBackPressedDispatcher .AddCallback(f, _navigationManager.BackClick); }
public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f) { if (f is NavigationViewFragment pf) { _stackNavigationManager.OnNavigationViewFragmentResumed(fm, pf); } AToolbar?nativeToolbar = null; IToolbar?toolbar = null; if (_stackNavigationManager.NavigationView?.Toolbar is IToolbar tb && tb?.Handler?.NativeView is AToolbar ntb) { nativeToolbar = ntb; toolbar = tb; } // Wire up the toolbar to the currently made visible Fragment var controller = NavHostFragment.FindNavController(f); var appbarConfigBuilder = new AppBarConfiguration .Builder(_stackNavigationManager.NavGraph); if (nativeToolbar != null && toolbar != null) { // TODO: MAUI Hackey way of wiring up Drawer Layout // But currently you can only have a nav bar with a Navigation View if (nativeToolbar.Parent is DrawerLayout dl1) { appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl1); } else if (nativeToolbar.Parent?.Parent is DrawerLayout dl2) { appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl2); } else if (nativeToolbar.Parent?.Parent?.Parent is DrawerLayout dl3) { appbarConfigBuilder = appbarConfigBuilder.SetOpenableLayout(dl3); } var appbarConfig = appbarConfigBuilder.Build(); NavigationUI .SetupWithNavController(nativeToolbar, controller, appbarConfig); // the call to SetupWithNavController resets the Navigation Icon toolbar.Handler?.UpdateValue(nameof(IToolbar.BackButtonVisible)); if (toolbar.BackButtonVisible && toolbar.IsVisible) { // Wiring up to this will break the Drawer Toggle button if it's visible nativeToolbar.SetNavigationOnClickListener(_stackNavigationManager.BackClick); } } }
void ExecuteTransaction(FragmentTransaction transaction) { // We don't currently support fragment restoration // So we don't need to worry about loss of this fragment's state transaction.CommitAllowingStateLossEx(); // The transaction need to be executed after View has been attached // So Fragment Manager can find the View being added FragmentManager.ExecutePendingTransactionsEx(); }
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); }
public override void OnFragmentViewDestroyed( AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f) { if (f is NavigationViewFragment pf) { _stackNavigationManager.OnNavigationViewFragmentDestroyed(fm, pf); } base.OnFragmentViewDestroyed(fm, f); }
internal static IVisualElementRenderer CreateRenderer(VisualElement element, AndroidX.Fragment.App.FragmentManager fragmentManager, Context context) { IVisualElementRenderer renderer = Registrar.Registered.GetHandlerForObject <IVisualElementRenderer>(element, context) ?? new DefaultRenderer(context); var managesFragments = renderer as IManageFragments; managesFragments?.SetFragmentManager(fragmentManager); renderer.SetElement(element); return(renderer); }
internal static IVisualElementRenderer CreateRenderer(VisualElement element, AndroidX.Fragment.App.FragmentManager fragmentManager, Context context) { IVisualElementRenderer renderer = CreateRenderer(element, context); var managesFragments = renderer as IManageFragments; managesFragments?.SetFragmentManager(fragmentManager); renderer.SetElement(element); return(renderer); }
public override void OnFragmentResumed(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f) { if (f is NavigationViewFragment pf) { _navigationManager.OnNavigationViewFragmentResumed(fm, pf); } // This wires up the hardware back button to this fragment f.RequireActivity() .OnBackPressedDispatcher .AddCallback(f, _navigationManager.BackClick); }
protected virtual IMvxFragmentView CreateFragment(FragmentManager fragmentManager, MvxBasePresentationAttribute attribute, Type fragmentType) { try { var fragmentClass = Class.FromType(fragmentType); var fragment = (IMvxFragmentView)fragmentManager.FragmentFactory.Instantiate(fragmentClass.ClassLoader, fragmentClass.Name); return(fragment); } catch (System.Exception ex) { throw new MvxException(ex, $"Cannot create Fragment '{fragmentType.Name}'"); } }
public override void Show(FragmentManager manager, string tag) { try { var transaction = manager.BeginTransaction(); transaction.Add(this, Tag); transaction.CommitAllowingStateLoss(); } catch (IllegalStateException e) { // This sometimes fails for some reason, not sure why Logger.Error(e); } }
private void PopOnBackstackEntries( string fragmentName, FragmentManager fragmentManager, MvxFragmentPresentationAttribute fragmentAttribute) { var popBackStackFragmentName = string.IsNullOrEmpty(fragmentAttribute.PopBackStackImmediateName?.Trim()) ? fragmentName : fragmentAttribute.PopBackStackImmediateName; fragmentManager.PopBackStackImmediate( popBackStackFragmentName, (int)fragmentAttribute.PopBackStackImmediateFlag.ToNativePopBackStackFlags()); OnFragmentPopped(null, null, fragmentAttribute); }
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); SetContentView(Resource.Layout.activity_main); BottomNavigationView navigation = FindViewById <BottomNavigationView>(Resource.Id.navigation); navigation.SetOnNavigationItemSelectedListener(this); fm = this.SupportFragmentManager; settings = new UserSettings(this); currentF = new MainFlowFragment(); }
public void Initialize() { LatLng southwest = new LatLng(30, 118); CameraPosition.Builder builder = new CameraPosition.Builder(); CameraPosition cameraPosition = builder.Target(southwest).Zoom(2).Bearing(2.0f).Tilt(2.5f).Build(); HuaweiMapOptions huaweiMapOptions = new HuaweiMapOptions().InvokeCamera(cameraPosition); mSupportMapFragment = SupportMapFragment.NewInstance(huaweiMapOptions); mSupportMapFragment.GetMapAsync(this); AndroidX.Fragment.App.FragmentManager fragmentManager = SupportFragmentManager; AndroidX.Fragment.App.FragmentTransaction fragmentTransaction = fragmentManager.BeginTransaction(); fragmentTransaction.Add(Resource.Id.frame_supportmapcode, mSupportMapFragment); fragmentTransaction.Commit(); }
/// <summary> /// Detect the Fragment containing this View by traversing all the ChildFragmenManagers /// </summary> /// <param name="view">The current view</param> /// <param name="fragmentManager">The current FragmentManager</param> /// <returns></returns> internal static Fragment ParentFragment(this View view, FragmentManager fragmentManager) { //This is a bit clunky but is needed because in Forms EVERYTHING is internal! //We could use FragmentContainer or PageContainer b ut we would need reflection wich is slow foreach (var fragment in fragmentManager.Fragments) { if (fragment.View?.FindViewById(view.Id) != null && fragment.ChildFragmentManager?.Fragments.Count > 0) { var childManager = fragment.ChildFragmentManager.Fragments[0].ChildFragmentManager; return(childManager?.Fragments?.Count > 0 ? view.ParentFragment(childManager) : fragment.ChildFragmentManager.Fragments.Last()); } } return(null); }