Navigation Drawer helps developers for creating easy menus in an application.
Lets start to see how it works.
We will start by creating a new project with a navigation drawer activity.
Adding Navigation Drawer Activity
If you want to add Navigation Drawer Activity to your existing project you can simply add it by going to your package -> right click -> new -> activity -> navigation drawer activity
This is the simplest way for creating a navigation drawer activity.
Navigation Drawer Menus
To change the menu open the activity_main_drawer.xml inside menu folder.
This is my activity_main_drawer.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_camera" android:icon="@drawable/ic_menu_camera" android:title="Import" /> <item android:id="@+id/nav_gallery" android:icon="@drawable/ic_menu_gallery" android:title="Gallery" /> <item android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:title="Slideshow" /> <item android:id="@+id/nav_manage" android:icon="@drawable/ic_menu_manage" android:title="Tools" /> </group> <item android:title="Communicate"> <menu> <item android:id="@+id/nav_share" android:icon="@drawable/ic_menu_share" android:title="Share" /> <item android:id="@+id/nav_send" android:icon="@drawable/ic_menu_send" android:title="Send" /> </menu> </item> </menu>
Try changing the values and run.
Handling Events
Open you activity which has the Drawer in it. It will contain a method like this.
@SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }
Changing Screens using Fragments for each MenuItem
For Simplicity, I am creating a Fragment for all the Menu Items which has a layout with only a TextView.
Layout Change
We will add a FrameLayout inside the content_home.xml for adding and replacing Fragments.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="net.simplifiedcoding.navigationdrawerexample.MainActivity" tools:showIn="@layout/app_bar_main"> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
MenuFragment
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class MenuScreen extends Fragment { private String menuText; public static MenuScreen newInstance(String menuText) { MenuScreen fragment = new MenuScreen(); this.menuText = menuText; return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { TextView tv = new TextView(this); tv.setText(menuText); return tv; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getActivity().setTitle(menuText); } }
Adding Screens for each Menu
@SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); MenuFragment menuFragment = null; if (id == R.id.nav_camera) { menuFragment = MenuFragment.newInstance("Menu 1"); } else if (id == R.id.nav_gallery) { menuFragment = MenuFragment.newInstance("Menu 2"); } else if (id == R.id.nav_slideshow) { menuFragment = MenuFragment.newInstance("Menu 3"); } else if (id == R.id.nav_manage) { menuFragment = MenuFragment.newInstance("Menu 4"); } else if (id == R.id.nav_share) { menuFragment = MenuFragment.newInstance("Menu 5"); } else if (id == R.id.nav_send) { menuFragment = MenuFragment.newInstance("Menu 6"); } // replacing the fragment if (menuFragment != null) { FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(R.id.content_frame, fragment).commit(); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }
Display First Screen
To Display the first screen we will add the first fragment in the onCreate of the Activity.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); if (savedInstanceState == null) { EmployeeFragmentFragment employeeFragmentFragment = new EmployeeFragmentFragment(); FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.add(R.id.content_frame, employeeFragmentFragment).commit(); } }
All Done.
Please send your valuable comments to coderzheaven@gmail.com