summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs
diff options
context:
space:
mode:
authorJason Smith <jason.smith@xamarin.com>2016-03-22 13:02:25 -0700
committerJason Smith <jason.smith@xamarin.com>2016-03-22 16:13:41 -0700
commit17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch)
treeb5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Platform.Android/Renderers/NavigationMenuRenderer.cs
downloadxamarin-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.cs152
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