summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoradrianknight89 <adrianknight89@outlook.com>2017-01-12 05:51:40 -0600
committerRui Marinho <me@ruimarinho.net>2017-01-12 11:51:40 +0000
commit20ed60fa9e28de2573004874a52d2b02a8067f85 (patch)
tree6f5c133e00d5e41a7b5ca13e0bfea7825497068a
parent32df5c0ae5ad66e2ed25926d97b62c29f1b9e134 (diff)
downloadxamarin-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.cs45
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();