Question

I have developed an application that have one activity and in this activity there are add some fragment in drawer list item (side).So my issue is when I am open on any drawer fragment item and then pressed back button application going to close.So how to handle back event like 3 - 2 -1 when pressed back its open precious fragment.

Code of main activity

    public class MainActivity extends FragmentActivity {
    private DrawerLayout DrawerLayout;
    private ListView DrawerList;
    private ActionBarDrawerToggle DrawerToggle;

    private CharSequence DrawerTitle;

    private CharSequence Title;

    private String[] MenuTitles;
    private TypedArray MenuIcons;

    private DrawerListAdapter adapter;
    private ArrayList<DrawerItem> DrawerItems;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Title = DrawerTitle = getTitle();

        MenuTitles = getResources().getStringArray(R.array.drawer_items);

        MenuIcons = getResources().obtainTypedArray(R.array.drawer_icons);

        DrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        DrawerList = (ListView) findViewById(R.id.list_slidermenu);

        DrawerItems = new ArrayList<DrawerItem>();

        DrawerItems.add(new DrawerItem(MenuTitles[0], MenuIcons.getResourceId(
                0, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[1], MenuIcons.getResourceId(
                1, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[2], MenuIcons.getResourceId(
                2, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[3], MenuIcons.getResourceId(
                3, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[4], MenuIcons.getResourceId(
                4, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[5], MenuIcons.getResourceId(
                5, -1)));

        DrawerItems.add(new DrawerItem(MenuTitles[6], MenuIcons.getResourceId(
                6, -1)));

        MenuIcons.recycle();

        DrawerList.setOnItemClickListener(new SlideMenuClickListener());

        adapter = new DrawerListAdapter(getApplicationContext(), DrawerItems);
        DrawerList.setAdapter(adapter);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        DrawerToggle = new ActionBarDrawerToggle(this, DrawerLayout,
                R.drawable.ic_drawer, R.string.app_name, R.string.app_name) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(Title);

                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(DrawerTitle);

                invalidateOptionsMenu();
            }
        };
        DrawerLayout.setDrawerListener(DrawerToggle);

        if (savedInstanceState == null) {

            displayView(0);
        }
    }

    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {

            displayView(position);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (DrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        boolean drawerOpen = DrawerLayout.isDrawerOpen(DrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    @SuppressLint("NewApi")
    private void displayView(int position) {

        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new Home_Activity();
                break;
            case 1:
                fragment = new Activity_two();
                break;
            case 2:
                fragment = new Activity_three();
                break;
            case 3:
                fragment = new Activity_four();
                break;
            case 4:
                fragment = new Activity_five();
                break;
            case 5:
                fragment = new Activity_six();
                break;
            case 6:
                fragment = new Activity_seven();
                break;

            default:
                break;



FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_container, fragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            DrawerList.setItemChecked(position, true);
            DrawerList.setSelection(position);
            setTitle(MenuTitles[position]);
            DrawerLayout.closeDrawer(DrawerList);
        } else {

            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    @SuppressLint("NewApi")
    @Override
    public void setTitle(CharSequence title) {
        Title = title;
        getActionBar().setTitle(Title);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        DrawerToggle.syncState();
    }


one fragment code...

    public class Activiy_three extends Fragment {

    private GridView gallery;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.activity_three_fragment,
                container, false);
        List<Item> Images = new ArrayList<Item>();
        //todo : develop as per date photo
        Images.add(new Item("Image 1", R.drawable.penguins));
        Images.add(new Item("Image 1", R.drawable.pulips));
        Images.add(new Item("Image 1", R.drawable.lighthouse));
        Images.add(new Item("Image 1", R.drawable.koala));
        Images.add(new Item("Image 1", R.drawable.jellyfish));
        Images.add(new Item("Image 1", R.drawable.hydrangeas));
        Images.add(new Item("Image 1", R.drawable.chrysanthemum));
        Images.add(new Item("Image 1", R.drawable.home));

        gallery = (GridView) v.findViewById(R.id.gridview);
        Global.photoAdapter = new PhotoAdapter(getActivity(), Images,false);
        gallery.setAdapter(Global.photoAdapter);

        gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

//                Intent i = new Intent(getActivity(), FullImageActivity.class);
//                i.putExtra(Global.Id, position);
//                startActivity(i);

                Fragment fragment = new FullImageActivity();
                FragmentManager fragmentManager = getFragmentManager();

                Bundle args = new Bundle();
                args.putInt(Global.Id, position);
                fragment.setArguments(args);

                fragmentManager.beginTransaction()
                        .replace(R.id.frame_container, fragment).commit();
            }
        });
        return v;
    }
}
Was it helpful?

Solution

You need add the fragment to the backstack

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(null);
transaction.commit();

And you can use popBackStack() to pop the fragment from the stack

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

Edit:

What you have

 default:
            break;

 FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_container, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

Should be

private void displayView(int position) {

    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new Home_Activity();
            break;
        case 1:
            fragment = new Activity_two();
            break;
        case 2:
            fragment = new Activity_three();
            break;
        case 3:
            fragment = new Activity_four();
            break;
        case 4:
            fragment = new Activity_five();
            break;
        case 5:
            fragment = new Activity_six();
            break;
        case 6:
            fragment = new Activity_seven();
            break;

        default:
            break;

    }

    if (fragment != null) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_container, fragment);
        transaction.addToBackStack(null);
        transaction.commit();

        DrawerList.setItemChecked(position, true);
        DrawerList.setSelection(position);
        setTitle(MenuTitles[position]);
        DrawerLayout.closeDrawer(DrawerList);
    } else {

        Log.e("MainActivity", "Error in creating fragment");
    }
}

OTHER TIPS

You can use getName method of FragmentManager.BackStackEntry which is introduced in API level 14 with

FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(getActivity().getFragmentManager().getBackStackEntryCount()-1);
String str=backEntry.getName();
Fragment fragment=getFragmentManager().findFragmentByTag(str);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top