diff options
author | adrianknight89 <adrianknight89@outlook.com> | 2017-01-12 05:51:40 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-01-12 11:51:40 +0000 |
commit | 20ed60fa9e28de2573004874a52d2b02a8067f85 (patch) | |
tree | 6f5c133e00d5e41a7b5ca13e0bfea7825497068a | |
parent | 32df5c0ae5ad66e2ed25926d97b62c29f1b9e134 (diff) | |
download | xamarin-forms-20ed60fa9e28de2573004874a52d2b02a8067f85.tar.gz xamarin-forms-20ed60fa9e28de2573004874a52d2b02a8067f85.tar.bz2 xamarin-forms-20ed60fa9e28de2573004874a52d2b02a8067f85.zip |
[Android] NavigationPageRenderer should not create a Fragment unnecessarily (#627)
* Do not create fragments unnecessarily
* use existing list
* remove local variable
* Revert "remove local variable"
This reverts commit 266e2c3657733c390931df79d4729206b456dfcd.
* remove local variable
* change order of returns
-rw-r--r-- | Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index d22d6a28..9e37e666 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -588,33 +588,30 @@ namespace Xamarin.Forms.Platform.Android.AppCompat _toolbar = bar; } - Task<bool> SwitchContentAsync(Page view, bool animated, bool removed = false, bool popToRoot = false) + Task<bool> SwitchContentAsync(Page page, bool animated, bool removed = false, bool popToRoot = false) { var tcs = new TaskCompletionSource<bool>(); - Fragment fragment = FragmentContainer.CreateInstance(view); - FragmentManager fm = FragmentManager; + Fragment fragment = GetFragment(page, removed, popToRoot); #if DEBUG // Enables logging of moveToState operations to logcat FragmentManager.EnableDebugLogging(true); #endif - List<Fragment> fragments = _fragmentStack; - - Current = view; + Current = page; ((Platform)Element.Platform).NavAnimationInProgress = true; - FragmentTransaction transaction = fm.BeginTransaction(); + FragmentTransaction transaction = FragmentManager.BeginTransaction(); if (animated) SetupPageTransition(transaction, !removed); transaction.DisallowAddToBackStack(); - if (fragments.Count == 0) + if (_fragmentStack.Count == 0) { transaction.Add(Id, fragment); - fragments.Add(fragment); + _fragmentStack.Add(fragment); } else { @@ -622,18 +619,18 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { // pop only one page, or pop everything to the root var popPage = true; - while (fragments.Count > 1 && popPage) + while (_fragmentStack.Count > 1 && popPage) { - Fragment currentToRemove = fragments.Last(); - fragments.RemoveAt(fragments.Count - 1); + Fragment currentToRemove = _fragmentStack.Last(); + _fragmentStack.RemoveAt(_fragmentStack.Count - 1); transaction.Remove(currentToRemove); popPage = popToRoot; } - Fragment toShow = fragments.Last(); + Fragment toShow = _fragmentStack.Last(); // Execute pending transactions so that we can be sure the fragment list is accurate. - fm.ExecutePendingTransactions(); - if (fm.Fragments.Contains(toShow)) + FragmentManager.ExecutePendingTransactions(); + if (FragmentManager.Fragments.Contains(toShow)) transaction.Show(toShow); else transaction.Add(Id, toShow); @@ -641,10 +638,10 @@ namespace Xamarin.Forms.Platform.Android.AppCompat else { // push - Fragment currentToHide = fragments.Last(); + Fragment currentToHide = _fragmentStack.Last(); transaction.Hide(currentToHide); transaction.Add(Id, fragment); - fragments.Add(fragment); + _fragmentStack.Add(fragment); } } @@ -698,6 +695,20 @@ namespace Xamarin.Forms.Platform.Android.AppCompat return tcs.Task; } + Fragment GetFragment(Page page, bool removed, bool popToRoot) + { + // pop + if (removed) + return _fragmentStack[_fragmentStack.Count - 2]; + + // pop to root + if(popToRoot) + return _fragmentStack[0]; + + // push + return FragmentContainer.CreateInstance(page); + } + void ToolbarTrackerOnCollectionChanged(object sender, EventArgs eventArgs) { UpdateMenu(); |