Thursday, June 19, 2014

Navigation Drawer Icon in Action Bar without Using Drawer Layout

This post help us to get navigation drawer icon without android drawer layout in the Action Bar.

Enable action bar icon to support navigation drawer toggle.
// Set whether home should be displayed as an "up" affordance.
// Set this to true if selecting "home" returns up by a single level in your UI rather than back to the top level or front page.
getActionBar().setDisplayHomeAsUpEnabled(true);
//Enable or disable the "home" button in the corner of the action bar.
getActionBar().setHomeButtonEnabled(true);

We should be aware of navigation drawer before starting, navigation drawer helps user to bring the navigation drawer onto the screen by swiping from the left edge of the screen or by touching the application icon on the action bar.

On Tap of application icon, Navigation drawer opens by using DrawerLayout listeners, where ActionBarDrawerToggle supports us from toggling the drawer.

This class provides a handy way to tie together the functionality of DrawerLayout and the framework ActionBar to implement the recommended design for navigation drawers.

ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int drawerImageRes, int openDrawerContentDescRes, int closeDrawerContentDescRes)

Construct a new ActionBarDrawerToggle.
The given Activity will be linked to the specified DrawerLayout. The provided drawer indicator drawable will animate slightly off-screen as the drawer is opened, indicating that in the open state the drawer will move off-screen when pressed and in the closed state the drawer will move on-screen when pressed.
String resources must be provided to describe the open/close drawer actions for accessibility services.
Parameters

activity The Activity hosting the drawer
drawerLayout The DrawerLayout to link to the given Activity's ActionBar
drawerImageRes A Drawable resource to use as the drawer indicator
openDrawerContentDescRes A String resource to describe the "open drawer" action for accessibility
closeDrawerContentDescRes A String resource to describe the "close drawer" action for accessibility

The third parameter is the drawable which we are seeing beside the action bar icon.

Now the question, How can we update the navigation drawer icon without DrawerLayout?

Just call updateNavigationDrawerIcon method after enabling the action bar methods.

public void updateNavigationDrawerIcon(Drawable drawable) {
Method setHomeAsUpIndicator;
           try {
           setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator",            Drawable.class);
           setHomeAsUpIndicator.invoke(getActionBar(), drawable);
           } catch (NoSuchMethodException e) {
                      Log.e("CHECK", "No Such Method");
                      View home = findViewById(android.R.id.home);
                      ViewGroup parent = (ViewGroup) home.getParent();
                      int childCount = parent.getChildCount();
                      if (childCount == 2) {
                                final View first = parent.getChildAt(0);
                                final View second = parent.getChildAt(1);
                               final View up = first.getId() == android.R.id.home ? second : first;
                                 ((ImageView) up).setImageDrawable(drawable);
                      }
           } catch (Exception e) {
           e.printStackTrace();
           }
}

On click of app icon, we will be invoking onOptionsItemSelected method.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

           switch (item.getItemId()) {
           case android.R.id.home:
                      Log.d("CHECK", "Navigation Icon is selected");
                      // Use for slide from left to right
                      slide_me.toggleLeftDrawer();
                      break;
           }
           return super.onOptionsItemSelected(item);
}

Output:




Source Code
You can download the source code by Source Code Click Here.  This project is built using eclipse IDE. Unzip and import the project into Eclipse, it’s a good idea to use the Project by clean and rebuild from the project menu. It works in all API levels above 14.

Thanks for reading :) 
Whether this post is helpful?

Have something to add to this post? If you have any other quick thoughts/hints that you think people will find useful? Share it in the comments.

1 comment :