Skip to content

Instantly share code, notes, and snippets.

@ChaseFlorell
Last active August 29, 2015 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChaseFlorell/10673476 to your computer and use it in GitHub Desktop.
Save ChaseFlorell/10673476 to your computer and use it in GitHub Desktop.
An Android Navigation Drawer that supports single and dual sliding drawers.
using System;
using Android.App;
using Android.Support.V4.App;
using Android.Support.V4.Widget;
using Android.Views;
namespace FutureState.BreathingRoom.Droid.Ui
{
public class ActionBarDrawerEventArgs : EventArgs
{
public View DrawerView { get; set; }
public float SlideOffset { get; set; }
public int NewState { get; set; }
}
public delegate void ActionBarDrawerChangedEventHandler(object s, ActionBarDrawerEventArgs e);
public class DrawerToggler : ActionBarDrawerToggle
{
private readonly DrawerLayout _drawerLayout;
private readonly View _leftDrawerView;
private readonly View _rightDrawerView;
public DrawerToggler(Activity activity, DrawerLayout drawerLayout, int drawerImageRes, int openDrawerContentDescRes, int closeDrawerContentDescRes)
: base(activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes)
{ }
public DrawerToggler(Activity activity, DrawerLayout drawerLayout, int drawerImageRes, int openDrawerContentDescRes, int closeDrawerContentDescRes, View leftDrawerView, View rightDrawerView)
: base(activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes)
{
_drawerLayout = drawerLayout;
_leftDrawerView = leftDrawerView;
_rightDrawerView = rightDrawerView;
}
public event ActionBarDrawerChangedEventHandler DrawerClosed;
public event ActionBarDrawerChangedEventHandler DrawerOpened;
public event ActionBarDrawerChangedEventHandler DrawerSlide;
public event ActionBarDrawerChangedEventHandler DrawerStateChanged;
public override void OnDrawerClosed(View drawerView)
{
if (null != DrawerClosed)
DrawerClosed(this, new ActionBarDrawerEventArgs { DrawerView = drawerView });
base.OnDrawerClosed(drawerView);
if (_leftDrawerView == null || _rightDrawerView == null || _drawerLayout == null) return;
_drawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked,
drawerView == _rightDrawerView
? _leftDrawerView
: _rightDrawerView);
}
public override void OnDrawerOpened(View drawerView)
{
if (null != DrawerOpened)
DrawerOpened(this, new ActionBarDrawerEventArgs { DrawerView = drawerView });
base.OnDrawerOpened(drawerView);
if (_leftDrawerView == null || _rightDrawerView == null || _drawerLayout == null) return;
_drawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed,
drawerView == _rightDrawerView
? _leftDrawerView
: _rightDrawerView);
}
public override void OnDrawerSlide(View drawerView, float slideOffset)
{
if (null != DrawerSlide)
DrawerSlide(this, new ActionBarDrawerEventArgs
{
DrawerView = drawerView,
SlideOffset = slideOffset
});
// only slide the left nav item
// not working as I would like.
if ((drawerView == _leftDrawerView) || (_leftDrawerView == null && _rightDrawerView == null))
{
base.OnDrawerSlide(drawerView, slideOffset);
}
}
public override void OnDrawerStateChanged(int newState)
{
if (null != DrawerStateChanged)
DrawerStateChanged(this, new ActionBarDrawerEventArgs
{
NewState = newState
});
base.OnDrawerStateChanged(newState);
}
}
}
/// <summary>
/// Navigation Drawer Configuration
/// </summary>
private void SetNavigationDrawerConfiguration()
{
// Left Drawer Config
_drawerToggler = new DrawerToggler(this,
_rootViewLayout, // found using FindViewById
Resource.Drawable.ic_drawer_light,
Resource.String.drawer_open,
Resource.String.drawer_close,
_leftDrawerLayout, // found using FindViewById
_rightDrawerLayout);// found using FindViewById
_drawerToggler.DrawerClosed += delegate { InvalidateOptionsMenu(); };
_drawerToggler.DrawerOpened += delegate
{
_leftDrawerList.SetItemChecked(_leftDrawerPosition, true);
_rightDrawerList.SetItemChecked(_rightDrawerPosition, true);
InvalidateOptionsMenu();
};
_rootViewLayout.SetDrawerShadow(Resource.Drawable.drawer_shadow_dark, (int)GravityFlags.Left); // left drawer shadow
_rootViewLayout.SetDrawerShadow(Resource.Drawable.right_drawer_shadow_dark, (int)GravityFlags.Right); // right drawer shadow
_rootViewLayout.SetDrawerListener(_drawerToggler);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment