diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android/AppCompat/SwitchRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/AppCompat/SwitchRenderer.cs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/SwitchRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/SwitchRenderer.cs new file mode 100644 index 00000000..f243c634 --- /dev/null +++ b/Xamarin.Forms.Platform.Android/AppCompat/SwitchRenderer.cs @@ -0,0 +1,92 @@ +using System; +using Android.Support.V7.Widget; +using Android.Widget; + +namespace Xamarin.Forms.Platform.Android.AppCompat +{ + public class SwitchRenderer : ViewRenderer<Switch, SwitchCompat>, CompoundButton.IOnCheckedChangeListener + { + bool _disposed; + + public SwitchRenderer() + { + AutoPackage = false; + } + + void CompoundButton.IOnCheckedChangeListener.OnCheckedChanged(CompoundButton buttonView, bool isChecked) + { + ((IViewController)Element).SetValueFromRenderer(Switch.IsToggledProperty, isChecked); + } + + public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) + { + SizeRequest sizeConstraint = base.GetDesiredSize(widthConstraint, heightConstraint); + + if (sizeConstraint.Request.Width == 0) + { + int width = widthConstraint; + if (widthConstraint <= 0) + width = (int)Context.GetThemeAttributeDp(global::Android.Resource.Attribute.SwitchMinWidth); + else if (widthConstraint <= 0) + width = 100; + + sizeConstraint = new SizeRequest(new Size(width, sizeConstraint.Request.Height), new Size(width, sizeConstraint.Minimum.Height)); + } + + return sizeConstraint; + } + + protected override SwitchCompat CreateNativeControl() + { + return new SwitchCompat(Context); + } + + protected override void Dispose(bool disposing) + { + if (disposing && !_disposed) + { + _disposed = true; + + if (Element != null) + Element.Toggled -= HandleToggled; + + Control.SetOnCheckedChangeListener(null); + } + + base.Dispose(disposing); + } + + protected override void OnElementChanged(ElementChangedEventArgs<Switch> e) + { + base.OnElementChanged(e); + + if (e.OldElement != null) + e.OldElement.Toggled -= HandleToggled; + + if (e.NewElement != null) + { + if (Control == null) + { + SwitchCompat aswitch = CreateNativeControl(); + aswitch.SetOnCheckedChangeListener(this); + SetNativeControl(aswitch); + } + else + UpdateEnabled(); // Normally set by SetNativeControl, but not when the Control is reused. + + e.NewElement.Toggled += HandleToggled; + Control.Checked = e.NewElement.IsToggled; + } + } + + void HandleToggled(object sender, EventArgs e) + { + Control.Checked = Element.IsToggled; + } + + void UpdateEnabled() + { + Control.Enabled = Element.IsEnabled; + } + } +}
\ No newline at end of file |