Navigation Drawer with backword compatibility android

I am having a application which is having four different activities. Now i want to add a navigation drawer in application to navigates those activities. Can any one give an example or tutorial for navigation drawer for different activity with back word compatibility.I have seen example for fragments but I need example for activities.


Solution 1:

You need to use appcompact from the Support Library.

Your activity needs to extend ActionBarActivity.

In your Activity

 public class MainActivity extends ActionBarActivity {

Import

 import android.support.v7.app.ActionBarActivity;

Instead of getActionBar() use getSupportActionbar()

Use Them.AppCompact

Or use ActionBarSherlock library.

https://stackoverflow.com/questions/20071004/add-icon-in-drawerlist-by-actionbarsherlock/20077469#20077469

Example:

MainActivity.java

public class MainActivity extends ActionBarActivity {

    // Fields -----------------------------------------------------------------
    private DrawerLayout drawerLayout;
    private ListView drawerList;
    private ActionBarDrawerToggle drawerToggle;
    private MenuListAdapter menuAdapter;
    private int[] icons;
    private Fragment fragment1;
    private Fragment fragment2;
    private Fragment fragment3;
    private CharSequence drawerTitle;
    private CharSequence title;
    private final String[] titles = new String[]{
            "Title Fragment #1",
            "Title Fragment #2",
            "Title Fragment #3"
    };
    private final String[] subtitles = new String[]{
            "Subtitle Fragment #1",
            "Subtitle Fragment #2",
            "Subtitle Fragment #3"
    };

    // Lifecycle Callbacks ----------------------------------------------------
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // Base implemenation
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate the fragments
        fragment1 = new Fragment1();
        fragment2 = new Fragment2();
        fragment3 = new Fragment3();

        // Get the title from this activity
        title = drawerTitle = getTitle();

        // Get the icons from the drawables folder
        icons = new int[]{
                R.drawable.action_about,
                R.drawable.action_settings,
                R.drawable.collections_cloud
        };

        // Get the drawer layout from the XML file and the ListView inside it
        drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
        drawerList = (ListView)findViewById(R.id.listview_drawer);

        // Set a custom shadow over that overlays the main content
        // when the drawer opens
        drawerLayout.setDrawerShadow(
                R.drawable.drawer_shadow, GravityCompat.START);

        // Pass the string arrays to the MenuListAdapter, set the drawer
        // list adapter to it and set up its click listener
        menuAdapter = new MenuListAdapter(
                MainActivity.this, titles, subtitles, icons);
        drawerList.setAdapter(menuAdapter);
        drawerList.setOnItemClickListener(new DrawerItemClickListener());

        // Enable the action bar to have up navigation
        getSupportActionBar().setHomeButtonEnabled(true);
        //getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // Allow the the action bar to toggle the drawer
        drawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                R.drawable.ic_drawer,
                R.string.drawer_open,
                R.string.drawer_close){

            public void onDrawerClosed(View view){
                super.onDrawerClosed(view);
            }
            public void onDrawerOpened(View view){
                getSupportActionBar().setTitle(drawerTitle);
                super.onDrawerOpened(view);
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);

        // If this is the first time opening this activity,
        // start with loading fragment #1
        if (savedInstanceState == null){
            selectItem(0);
        }       

    }

    // Methods ----------------------------------------------------------------
    @Override
    public boolean onOptionsItemSelected(MenuItem item){

        // If the user has pressed the action bar icon
        if (item.getItemId() == android.R.id.home){

            // If the drawer is open, close it; vice versa
            if (drawerLayout.isDrawerOpen(drawerList)){
                drawerLayout.closeDrawer(drawerList);
            } else {
                drawerLayout.openDrawer(drawerList);
            }
        }

        // Finish by letting the super class do the rest
        return super.onOptionsItemSelected(item);

    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState){

        // Call the super implementation and synchronize the drawer
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();

    }
    @Override
    public void onConfigurationChanged(Configuration newConfig){

        // Call the super implemenation on this activity
        // and the drawer toggle object
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);

    }
    private void selectItem(int position){

        // Create a new fragment transaction and start it
        FragmentTransaction fragTran = getSupportFragmentManager()
                                       .beginTransaction();

        // Locate the position selected replace the content view
        // with the fragment of the number selected
        switch (position){
            case 0:{
                fragTran.replace(R.id.content_frame, fragment1);
                break;
            }
            case 1:{
                fragTran.replace(R.id.content_frame, fragment2);
                break;
            }
            case 2:{
                fragTran.replace(R.id.content_frame, fragment3);
                break;
            }
        }

        // Commit the transaction and close the drawer
        fragTran.commit();
        drawerList.setItemChecked(position, true);
        drawerLayout.closeDrawer(drawerList);

    }
    public void setTitle(CharSequence title){

        // Save the passed in title and set the action bar title
        this.title = title;
        getSupportActionBar().setTitle(title);

    }

    // Classes ----------------------------------------------------------------
    private class DrawerItemClickListener 
    implements ListView.OnItemClickListener{

        @Override
        public void onItemClick(
                AdapterView<?> parent, 
                View view, 
                int position,
                long id) {

            // When clicked, select open the appropriate fragment
            selectItem(position);

        }

    }

}

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 
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <ListView 
        android:id="@+id/listview_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"/>

</android.support.v4.widget.DrawerLayout>

public class MenuListAdapter extends BaseAdapter {

    // Fields -----------------------------------------------------------------
    private Context mcontext;
    private String[] titles;
    private String[] subtitles;
    private int[] icons;
    private LayoutInflater inflater;

    // Constructor ------------------------------------------------------------
    public MenuListAdapter(
            Context context, 
            String[] titles, 
            String[] subtitles,
            int[] icons){
        mcontext = context;
        this.titles = titles;
        this.subtitles = subtitles;
        this.icons = icons;
        inflater = (LayoutInflater)mcontext.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
    }

    // Accessors --------------------------------------------------------------
    @Override
    public int getCount(){
        return titles.length;
    }
    @Override
    public Object getItem(int position){
        return titles[position];
    }
    @Override
    public long getItemId(int position){
        return position;
    }

    // Methods ----------------------------------------------------------------
    public View getView(int position, View convertView, ViewGroup parent){

        ViewHolder viewHolder;

        // Only inflate the view if convertView is null
        if (convertView == null){
            viewHolder = new ViewHolder();
            if(inflater!=null)
            {
            convertView = inflater.inflate(
                    R.layout.drawer_list_item, parent, false);
            viewHolder.txtTitle = (TextView)convertView.findViewById(
                    R.id.title);
            viewHolder.txtSubtitle = (TextView)convertView.findViewById(
                    R.id.subtitle);
            viewHolder.imgIcon = (ImageView)convertView.findViewById(
                    R.id.icon);

            // This is the first time this view has been inflated,
            // so store the view holder in its tag fields
            convertView.setTag(viewHolder);
            }
            else
            {
                Log.i("........",""+null);
            }
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        // Set the views fields as needed
        viewHolder.txtTitle.setText(titles[position]);
        viewHolder.txtSubtitle.setText(subtitles[position]);
        viewHolder.imgIcon.setImageResource(icons[position]);

        return convertView;
    }

    // Classes ----------------------------------------------------------------
    static class ViewHolder {
        TextView txtTitle;
        TextView txtSubtitle;
        ImageView imgIcon;
    }

}

drawr_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray"
    android:orientation="horizontal"
    style="?attr/dropdownListPreferredItemHeight" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical|left"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:singleLine="true"
            style="?attr/spinnerDropDownItemStyle"/>
        <TextView 
            android:id="@+id/subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:singleLine="true"
            style="?attr/spinnerDropDownItemStyle"/>

    </LinearLayout>    

</LinearLayout>

fragment1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" >

    </ListView>

</RelativeLayout>

fragment2.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/Fragment2"/>

</RelativeLayout>

fragment3.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/Fragment3"/>

</RelativeLayout>

Fragment1.java

public class Fragment1 extends Fragment {
    String[] titles={"A","B","C"};
    @Override
    public View onCreateView(
            LayoutInflater inflater, 
            ViewGroup container, 
            Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.fragment1, container, false);
        ListView lv = (ListView) rootView.findViewById(R.id.listView1);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,titles);
        lv.setAdapter(adapter);
        return rootView;
    }   
}

Fragment2.java

public class Fragment2 extends Fragment {
    @Override
    public View onCreateView(
            LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.fragment2, container, false);
        return rootView;
    }
}

Fragment3.java

public class Fragment3 extends Fragment {
    @Override
    public View onCreateView(
            LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.fragment3, container, false);
        return rootView;
    }
}

Add theme in manifest

android:theme="@style/Theme.AppCompat"

Snap

enter image description here

Solution 2:

A new version of the v4 support library (release 13) which contains support for the Navigation Drawer pattern.
Check out the below tutorial Links for Navigation Drawer which provides the compatibility library of Navigation Drawer with the implementation in it.

1) Sherlock Navigation Drawer
2) NavDrawerExampleAppCompat-v7
3) Navigation Drawer in Android
4) Create Navigation Drawer

Hope this will help you.