diff options
author | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 13:02:25 -0700 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 16:13:41 -0700 |
commit | 17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch) | |
tree | b5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs | |
download | xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2 xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip |
Initial import
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs new file mode 100644 index 00000000..9678b9ca --- /dev/null +++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs @@ -0,0 +1,152 @@ +using System; +using System.ComponentModel; +using System.Linq; +using Android.Content; +using Android.Graphics; +using Android.Views; +using Android.Widget; +using AView = Android.Views.View; + +namespace Xamarin.Forms.Platform.Android +{ + public sealed class NavigationMenuRenderer : ViewRenderer + { + public NavigationMenuRenderer() + { + AutoPackage = false; + } + + GridView GridView + { + get { return Control as GridView; } + } + + NavigationMenu NavigationMenu + { + get { return Element as NavigationMenu; } + } + + protected override void OnElementChanged(ElementChangedEventArgs<View> e) + { + base.OnElementChanged(e); + + if (e.OldElement == null) + { + var grid = new GridView(Context); + grid.SetVerticalSpacing(20); + + SetNativeControl(grid); + } + + UpdateTargets(); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + switch (e.PropertyName) + { + case "Targets": + UpdateTargets(); + break; + } + } + + protected override void OnSizeChanged(int w, int h, int oldw, int oldh) + { + GridView.NumColumns = w > h ? 3 : 2; + base.OnSizeChanged(w, h, oldw, oldh); + } + + void UpdateTargets() + { + GridView.Adapter = new MenuAdapter(NavigationMenu); + } + + class MenuElementView : LinearLayout + { + readonly ImageButton _image; + readonly TextView _label; + string _icon; + + public MenuElementView(Context context) : base(context) + { + Orientation = Orientation.Vertical; + _image = new ImageButton(context); + _image.SetScaleType(ImageView.ScaleType.FitCenter); + _image.Click += (object sender, EventArgs e) => + { + if (Selected != null) + Selected(); + }; + AddView(_image, new LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) { Gravity = GravityFlags.Center }); + + _label = new TextView(context) { TextAlignment = global::Android.Views.TextAlignment.Center, Gravity = GravityFlags.Center }; + AddView(_label, new LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent)); + } + + public string Icon + { + get { return _icon; } + set + { + _icon = value; + Bitmap bitmap = Context.Resources.GetBitmap(_icon); + _image.SetImageBitmap(bitmap); + } + } + + public string Name + { + get { return _label.Text; } + set { _label.Text = value; } + } + + public Action Selected { get; set; } + } + + class MenuAdapter : BaseAdapter<Page> + { + readonly NavigationMenu _menu; + + public MenuAdapter(NavigationMenu menu) + { + _menu = menu; + } + + #region implemented abstract members of BaseAdapter + + public override Page this[int index] + { + get { return _menu.Targets.ElementAtOrDefault(index); } + } + + #endregion + + public override AView GetView(int position, AView convertView, ViewGroup parent) + { + MenuElementView menuItem = convertView as MenuElementView ?? new MenuElementView(parent.Context); + Page item = this[position]; + menuItem.Icon = item.Icon; + menuItem.Name = item.Title; + menuItem.Selected = () => _menu.SendTargetSelected(item); + return menuItem; + } + + #region implemented abstract members of BaseAdapter + + public override long GetItemId(int position) + { + return 0; + } + + public override int Count + { + get { return _menu.Targets.Count(); } + } + + #endregion + } + } +}
\ No newline at end of file |