protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true) { var previousView = _currentView; _currentView = CreateShellItemRenderer(newItem); _currentView.ShellItem = newItem; var fragment = _currentView.Fragment; FragmentTransaction transaction = manager.BeginTransactionEx(); if (animate) { transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.FragmentOpen); } transaction.ReplaceEx(_frameLayout.Id, fragment); transaction.CommitAllowingStateLossEx(); void OnDestroyed(object sender, EventArgs args) { previousView.Destroyed -= OnDestroyed; previousView.Dispose(); previousView = null; } if (previousView != null) { previousView.Destroyed += OnDestroyed; } }
protected override void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { _disposed = true; _page = null; if (!_fragmentManager.IsDestroyed) { FragmentTransaction transaction = _fragmentManager.BeginTransactionEx(); foreach (Fragment fragment in _fragments) { transaction.RemoveEx(fragment); transaction.SetTransitionEx((int)FragmentTransit.None); } transaction.CommitAllowingStateLossEx(); _fragmentManager.ExecutePendingTransactionsEx(); _fragments = null; _fragmentManager = null; } } base.Dispose(disposing); }
protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true) { Profile.FrameBegin(); Profile.FramePartition("IsDesignerContext"); if (AndroidContext.IsDesignerContext()) { return; } Profile.FramePartition("CreateShellItemRenderer"); var previousRenderer = _currentRenderer; _currentRenderer = CreateShellItemRenderer(newItem); _currentRenderer.ShellItem = newItem; var fragment = _currentRenderer.Fragment; Profile.FramePartition("Transaction"); FragmentTransaction transaction = manager.BeginTransaction(); if (animate) { transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.EnterMask); } transaction.ReplaceEx(_frameLayout.Id, fragment); transaction.CommitAllowingStateLossEx(); Profile.FramePartition("OnDestroyed"); void OnDestroyed(object sender, EventArgs args) { previousRenderer.Destroyed -= OnDestroyed; previousRenderer.Dispose(); previousRenderer = null; } if (previousRenderer != null) { previousRenderer.Destroyed += OnDestroyed; } Profile.FrameEnd(); }