diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android')
3 files changed, 39 insertions, 1 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs index 102bac53..1b85b42f 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs @@ -11,8 +11,9 @@ namespace Xamarin.Forms.Platform.Android.AppCompat PageContainer _pageContainer; FragmentManager _fragmentManager; readonly bool _isMaster; - readonly MasterDetailPage _parent; + MasterDetailPage _parent; Fragment _currentFragment; + bool _disposed; public MasterDetailContainer(MasterDetailPage parent, bool isMaster, Context context) : base(parent, isMaster, context) { @@ -106,6 +107,37 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } } + protected override void Dispose(bool disposing) + { + if (_disposed) + { + return; + } + + _disposed = true; + + if (disposing) + { + if (_currentFragment != null) + { + FragmentTransaction transaction = FragmentManager.BeginTransaction(); + transaction.DisallowAddToBackStack(); + transaction.Remove(_currentFragment); + transaction.SetTransition((int)FragmentTransit.None); + transaction.CommitAllowingStateLoss(); + FragmentManager.ExecutePendingTransactions(); + + _currentFragment = null; + } + + _parent = null; + _pageContainer = null; + _fragmentManager = null; + } + + base.Dispose(disposing); + } + public void SetFragmentManager(FragmentManager fragmentManager) { if (_fragmentManager == null) diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs index 6740285c..ccf01f22 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs @@ -188,24 +188,29 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (_detailLayout != null) { + RemoveView(_detailLayout); _detailLayout.Dispose(); _detailLayout = null; } if (_masterLayout != null) { + RemoveView(_masterLayout); _masterLayout.Dispose(); _masterLayout = null; } Device.Info.PropertyChanged -= DeviceInfoPropertyChanged; + RemoveDrawerListener(this); + if (Element != null) { MasterDetailPageController.BackButtonPressed -= OnBackButtonPressed; Element.PropertyChanged -= HandlePropertyChanged; Element.Appearing -= MasterDetailPageAppearing; Element.Disappearing -= MasterDetailPageDisappearing; + Element.ClearValue(Android.Platform.RendererProperty); Element = null; } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 97b2029a..b77063ee 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -173,6 +173,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (_drawerLayout != null && _drawerListener != null) { _drawerLayout.RemoveDrawerListener(_drawerListener); + _drawerListener = null; } _drawerToggle = null; |