Android Sliding Menu Using Navigation Drawer: Warehouse Software
Android Sliding Menu Using Navigation Drawer: Warehouse Software
DOWNLOAD
TIPS
Warehouse Software
fishbowlinventory.com
Quickbooks Inventory Management Free 14 Day Trial.
Ra vi T a ma da
Tw eet
61
270
Like
1.6k
Hyde ra ba d, IND IA
SU B SCRIB E
Advertise
adve rtise he re
bar.
In this tutorial we are going to learn how to use navigation drawer to add a sliding menu to your
application.
pdfcrowd.com
DOWNLOAD CODE
Advertise Here
Advertise Here
VIDEO DEMO
adve rtise he re
AndroidHive
Like
Example Applications
open in browser PRO version
pdfcrowd.com
You can see lot of popular applications like Facebook, Youtube, Google + already introduced navigation
drawer menu in their applications. Following are the navigation drawer menus of multiple apps.
Tag Cloud
Action Bar
Apps
Adapter
Async
Beginner
Dashboard
Database
Fragments
GCM
Google
GPS
Grid
List View
Locale
Gestures
Google Plus
HTTP
Libstreaming
Maps
MySQL
Navigation Drawer
PHP
Quick Tips
sessions
REST
Speech Input
SQLite
Grid View
json
Spinner
Swipe
API
Camera
GDK
Google Glass
Intermediate
Animation
Pinch
sponsored
Tab View
Video
Video Streaming
Volley
Wearable
Slim
UI
View Pager
xml
pdfcrowd.com
In order to demonstrate navigation drawer, I am taking an example of Google+ navigation drawer and
Ravi Tamada
explained the process to achieve the same. But before starting the project I have downloaded required
google.com/+RaviTamada
icons and using photoshop I have made each icon into different dimensions for xxhdpi (144144 px),
Follow
xhdpi (9696 px), hdpi (7272 px) and mdpi (4848 px) drawbles.
6,700 followers
Also I have downloaded navigation drawer toggle icon and included in drawable folders. You can get all
the images in the source code of this tutorial. We need another image to replace the action bar up icon
to toggle navigation drawer. Save following images and later add them to your project.
Most Popular
ic_drawer.png
New
pdfcrowd.com
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string
<string
<string
<string
<string
name="app_name">Slider Menu</string>
name="action_settings">Settings</string>
name="hello_world">Hello world!</string>
name="drawer_open">Slider Menu Opened</string>
name="drawer_close">Slider Menu Closed</string>
Android
Sliding
Menu
using Navigation
pdfcrowd.com
Here FrameLayout is used to replace the main content using Fragments and it should be always the
first child of the layout for z-index purpose.
activity_main.xml
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
pdfcrowd.com
Before start coding the custom adapter, I am going to create required layout files for the list view.
We need the layout drawables to state the list item state when normal and pressed. It needs overall
three xml files. One is for normal state, second is for pressed state and third one to combine both the
layouts.
4. So create a xml file under res
following code. (If you dont see drawable folder, create a new folder and name it as drawable)
list_item_bg_normal.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="@color/list_background"
android:endColor="@color/list_background"
android:angle="90" />
</shape>
5. Create another xml layout under res
content.
list_item_bg_pressed.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="@color/list_background_pressed"
android:endColor="@color/list_background_pressed"
android:angle="90" />
</shape>
6. Create another xml file to combine both the drawable states under res
drawable named
list_selector.xml
list_selector.xml
open in browser PRO version
pdfcrowd.com
drawable.
If you want to know how to add a rounded corner border layout, you can learn from How to add
Rounded Corner borders to Android Layout
counter_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- view background color -->
<solid android:color="@color/counter_text_bg" >
</solid>
<!-- If you want to add some padding -->
<padding
android:right="3dp"
android:left="3dp" >
</padding>
<!-- Here is the corner radius -->
<corners android:radius="2dp" >
</corners>
</shape>
8. As listview has the custom layout, we need another layout file which defines the each list row. So
create a layout file under res
pdfcrowd.com
drawer_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/list_selector">
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/desc_list_item_icon"
android:src="@drawable/ic_home"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/icon"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="@color/list_item_title"
android:gravity="center_vertical"
android:paddingRight="40dp"/>
<TextView android:id="@+id/counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/counter_bg"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
android:textColor="@color/counter_text_color"/>
</RelativeLayout>
pdfcrowd.com
As each list item contains three elements icon, title and a counter, I would like create a model to
represent each list row.
9. I prefer to create a new package to keep all the model classes. So create a new package named
info.androidhive.slidingmenu.model
10. Under model package create a new class named NavDrawerItem.java and paste the following
code. Here isCounterVisible defines the visibility of the counter value. If you dont want to show a
counter for a particular list item you can set this to false.
NavDrawerItem.java
package info.androidhive.slidingmenu.model;
public class NavDrawerItem {
private String title;
private int icon;
private String count = "0";
// boolean to set visiblity of the counter
private boolean isCounterVisible = false;
public NavDrawerItem(){}
public NavDrawerItem(String title, int icon){
this.title = title;
this.icon = icon;
}
public NavDrawerItem(String title, int icon, boolean isCounterVisible, String count){
this.title = title;
this.icon = icon;
this.isCounterVisible = isCounterVisible;
this.count = count;
}
public String getTitle(){
return this.title;
}
public int getIcon(){
pdfcrowd.com
11. Also create another package to keep all the adapter classes. Create a package named
info.androidhive.slidingmenu.adapter.
12. Now we have all the files required for custom list adapter. So create a class named
NavDrawerListAdapter.java under adapter package.
NavDrawerListAdapter.java
package info.androidhive.slidingmenu.adapter;
import info.androidhive.slidingmenu.R;
import info.androidhive.slidingmenu.model.NavDrawerItem;
pdfcrowd.com
import java.util.ArrayList;
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.ImageView;
android.widget.TextView;
pdfcrowd.com
return convertView;
}
Until now we are done creating all the required layouts, model and adapter class for navigation drawer.
Its time to move on to our MainActivity.java and start implementing the navigation drawer.
Following are the major steps we need take care of in the main activity.
> Creating a NavDrawerListAdapter instance and adding list items.
> Assigning the adapter to Navigation Drawer ListView
> Creating click event listener for list items
> Creating and displaying fragment activities on selecting list item.
13. So open your MainActivity.java and add the following code. In the following code, we declared
required variables, loaded the list items titles and icons from strings.xml, created an adapter and added
each list item. Finally we added a navigation drawer listener.
invalidateOptionsMenu() is called in onDrawerOpened() and onDrawerClosed() to hide and
show the action bar icons on navigation drawer opened and closed.
pdfcrowd.com
MainActivity.java
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(
// Photos
pdfcrowd.com
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2],
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3],
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4],
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
}
open in browser PRO version
pdfcrowd.com
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/***
* Called when invalidateOptionsMenu() is triggered
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
open in browser PRO version
pdfcrowd.com
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
Now if you run your project you can see the navigation drawer with a listview. You can open the
navigation drawer either clicking on action bar app icon or swiping the screen left edge to right. But you
can notice that the click event for list item not working as it is not enabled yet.
HomeFragment.java
package info.androidhive.slidingmenu;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
open in browser PRO version Are you a developer? Try out the HTML to PDF API
pdfcrowd.com
import android.view.View;
import android.view.ViewGroup;
public class HomeFragment extends Fragment {
public HomeFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container,
return rootView;
fragment_home.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txtLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="16dp"
android:text="Home View"/>
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/txtLabel"
android:src="@drawable/ic_home"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"/>
</RelativeLayout>
Also you need to create remaining fragment classes and layout files for other list items.
pdfcrowd.com
MainActivity.java
public class MainActivity extends Activity {
..
..
@Override
protected void onCreate(Bundle savedInstanceState) {
..
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
open in browser PRO version Are you a developer? Try out the HTML to PDF API
pdfcrowd.com
Now run the project and test the listview click event. You can see respected fragment is loading on
pdfcrowd.com
pdfcrowd.com
Final Code
MainActivity.java
MainActivity.java
package info.androidhive.slidingmenu;
import info.androidhive.slidingmenu.adapter.NavDrawerListAdapter;
import info.androidhive.slidingmenu.model.NavDrawerItem;
import java.util.ArrayList;
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.app.Fragment;
android.app.FragmentManager;
android.content.res.Configuration;
android.content.res.TypedArray;
android.os.Bundle;
android.support.v4.app.ActionBarDrawerToggle;
android.support.v4.widget.DrawerLayout;
android.util.Log;
android.view.Menu;
pdfcrowd.com
import
import
import
import
import
android.view.Menu;
android.view.MenuItem;
android.view.View;
android.widget.AdapterView;
android.widget.ListView;
pdfcrowd.com
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0],
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2],
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3],
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4],
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
navMenuIcons.getResourceId(
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
pdfcrowd.com
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/***
* Called when invalidateOptionsMenu() is triggered
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
open in browser PRO version Are you a developer? Try out the HTML to PDF API
pdfcrowd.com
pdfcrowd.com
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
2
1
270
1.6k
Like
Tw eet
pdfcrowd.com
Android Building
Android Working
Android Building
Part 1
Part 2
pdfcrowd.com
Advertise
Privacy Policy
pdfcrowd.com