diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2017-04-13 09:11:50 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-04-13 16:11:50 +0100 |
commit | aa1811126570b7d5e10c0473bad3b0dd0fb858eb (patch) | |
tree | 5128450f920dc05e3dcd9fe42dba076444193f09 /Xamarin.Forms.Platform.Android/Platform.cs | |
parent | a0affaafbd6d6721a5501384777959c7384d7ddb (diff) | |
download | xamarin-forms-aa1811126570b7d5e10c0473bad3b0dd0fb858eb.tar.gz xamarin-forms-aa1811126570b7d5e10c0473bad3b0dd0fb858eb.tar.bz2 xamarin-forms-aa1811126570b7d5e10c0473bad3b0dd0fb858eb.zip |
Verify FragmentContainer created when queueing fragment transaction (Android) (#865)
* Add check for disposed MasterDetailContainer when queueing fragment transaction
* Fix various ObjectDisposedExceptions when setting main page
* Add check for legacy renderers when querying control properties
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Platform.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/Platform.cs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/Xamarin.Forms.Platform.Android/Platform.cs b/Xamarin.Forms.Platform.Android/Platform.cs index 72a6d0c9..e2326d48 100644 --- a/Xamarin.Forms.Platform.Android/Platform.cs +++ b/Xamarin.Forms.Platform.Android/Platform.cs @@ -9,6 +9,7 @@ using Android.Content; using Android.Content.Res; using Android.Graphics; using Android.Graphics.Drawables; +using Android.OS; using Android.Support.V4.App; using Android.Util; using Android.Views; @@ -390,12 +391,14 @@ namespace Xamarin.Forms.Platform.Android internal void SetPage(Page newRoot) { var layout = false; + List<IVisualElementRenderer> toDispose = null; + if (Page != null) { _renderer.RemoveAllViews(); - foreach (IVisualElementRenderer rootRenderer in _navModel.Roots.Select(GetRenderer)) - rootRenderer.Dispose(); + toDispose = _navModel.Roots.Select(Android.Platform.GetRenderer).ToList(); + _navModel = new NavigationModel(); layout = true; @@ -415,6 +418,18 @@ namespace Xamarin.Forms.Platform.Android _toolbarTracker.Target = newRoot; UpdateActionBar(); + + if (toDispose?.Count > 0) + { + // Queue up disposal of the previous renderers after the current layout updates have finished + new Handler(Looper.MainLooper).Post(() => + { + foreach (IVisualElementRenderer rootRenderer in toDispose) + { + rootRenderer.Dispose(); + } + }); + } } internal static void SetPageContext(BindableObject bindable, Context context) |