From 462d132f6f5f42871716cdbd455fba70e711541c Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Sun, 24 Apr 2016 00:13:27 -0600 Subject: Allow renderers to specify whether native controls should be eagerly disposed (#129) --- .../NativeViewWrapperRenderer.cs | 2 ++ Xamarin.Forms.Platform.Android/ViewRenderer.cs | 2 +- Xamarin.Forms.Platform.Android/VisualElementRenderer.cs | 17 +++++++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) (limited to 'Xamarin.Forms.Platform.Android') diff --git a/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs b/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs index 933f436f..49abc02a 100644 --- a/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs +++ b/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs @@ -57,5 +57,7 @@ namespace Xamarin.Forms.Platform.Android if (!handled) base.OnMeasure(widthMeasureSpec, heightMeasureSpec); } + + protected override bool ManageNativeControlLifetime => false; } } \ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/ViewRenderer.cs b/Xamarin.Forms.Platform.Android/ViewRenderer.cs index 0415ce93..143e6a7f 100644 --- a/Xamarin.Forms.Platform.Android/ViewRenderer.cs +++ b/Xamarin.Forms.Platform.Android/ViewRenderer.cs @@ -69,7 +69,7 @@ namespace Xamarin.Forms.Platform.Android { if (disposing && !_disposed) { - if (Control != null) + if (Control != null && ManageNativeControlLifetime) { Control.RemoveFromParent(); Control.Dispose(); diff --git a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs index 5abb809f..d44714be 100644 --- a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs @@ -212,6 +212,12 @@ namespace Xamarin.Forms.Platform.Android Performance.Stop(); } + /// + /// Determines whether the native control is disposed of when this renderer is disposed + /// Can be overridden in deriving classes + /// + protected virtual bool ManageNativeControlLifetime => true; + protected override void Dispose(bool disposing) { if ((_flags & VisualElementRendererFlags.Disposed) != 0) @@ -244,11 +250,14 @@ namespace Xamarin.Forms.Platform.Android _gestureListener = null; } - int count = ChildCount; - for (var i = 0; i < count; i++) + if (ManageNativeControlLifetime) { - AView child = GetChildAt(i); - child.Dispose(); + int count = ChildCount; + for (var i = 0; i < count; i++) + { + AView child = GetChildAt(i); + child.Dispose(); + } } RemoveAllViews(); -- cgit v1.2.3