summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs
blob: d2f2397888e4bd4a583dc06a885881a2c00259f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using Xamarin.Forms.Internals;

namespace Xamarin.Forms.Platform.Android
{
	public class NativeViewWrapperRenderer : ViewRenderer<NativeViewWrapper, global::Android.Views.View>
	{
		public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint)
		{
			if (Element?.GetDesiredSizeDelegate == null)
				return base.GetDesiredSize(widthConstraint, heightConstraint);

			// The user has specified a different implementation of GetDesiredSizeDelegate
			SizeRequest? result = Element.GetDesiredSizeDelegate(this, widthConstraint, heightConstraint);

			// If the delegate returns a SizeRequest, we use it; if it returns null,
			// fall back to the default implementation
			return result ?? base.GetDesiredSize(widthConstraint, heightConstraint);
		}

		// not called by the view wrapper renderer
		protected override global::Android.Views.View CreateNativeControl()
		{
			return new global::Android.Views.View(Context);
		}

		protected override void OnElementChanged(ElementChangedEventArgs<NativeViewWrapper> e)
		{
			base.OnElementChanged(e);

			if (e.OldElement == null)
			{
				SetNativeControl(Element.NativeView);
				Control.LayoutChange += (sender, args) => ((IVisualElementController)Element)?.InvalidateMeasure(InvalidationTrigger.MeasureChanged);
			}
		}

		protected override void OnLayout(bool changed, int l, int t, int r, int b)
		{
			if (Element?.OnLayoutDelegate == null)
			{
				base.OnLayout(changed, l, t, r, b);
				return;
			}

			// The user has specified a different implementation of OnLayout
			bool handled = Element.OnLayoutDelegate(this, changed, l, t, r, b);

			// If the delegate wasn't able to handle the request, fall back to the default implementation
			if (!handled)
				base.OnLayout(changed, l, t, r, b);
		}

		protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
		{
			if (Element?.OnMeasureDelegate == null)
			{
				base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
				return;
			}

			// The user has specified a different implementation of OnMeasure
			bool handled = Element.OnMeasureDelegate(this, widthMeasureSpec, heightMeasureSpec);

			// If the delegate wasn't able to handle the request, fall back to the default implementation
			if (!handled)
				base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
		}

		protected override bool ManageNativeControlLifetime => false;
	}
}