0

I am using a navigation drawer.So when my application starts i am calling the homeFragment and keeping it in the backstack. Now if the user selects any options from the navigation drawer i am opening the respective fragment but without adding them to backstack. So what i want is that even when user has open 10 fragment, on pressing back they should be taken back to homeFragment only. But with my code the app exits on pressing back even homeFragment is in the backstack.

Code to openFragments

public static void replaceFragment(FragmentActivity activity, Fragment fragment, boolean addToBackStack) {


        try {
            String backStateName = fragment.getClass().getName();
            String fragmentTag = backStateName;
            FragmentManager manager = activity.getSupportFragmentManager();
            boolean fragmentPopped = manager.popBackStackImmediate(fragmentTag, 0);
            if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
                FragmentTransaction ft = manager.beginTransaction();
                ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
                ft.replace(R.id.frag_container, fragment, fragmentTag);
                if (addToBackStack) {
                    ft.addToBackStack(backStateName);
                }
                ft.commit();
            }
        } catch (Exception e) {

            e.printStackTrace();
        }
    } 

From MainActivity

private void init() {

        setUpToolBar();

        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerFrag = (NavigationDrawerFrag) getSupportFragmentManager().findFragmentById(R.id.frag_nav_drawer);
        drawerFrag.setUp(drawerLayout, toolbar, R.id.frag_nav_drawer);

        CommonFunctions.replaceFragment(this, new HomeFrag(), true);


    }

On NavigationDrawer Item click

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

        if (position == 1) {
            CommonFunctions.replaceFragment(getActivity(), new ProfileFrag(), false);

        } else if (position == 2) {
            CommonFunctions.replaceFragment(getActivity(), new CelebrityFrag(), false);

        } else if (position == 4) {
            CommonFunctions.replaceFragment(getActivity(), new AboutUsFrag(), false);

        } else if (position == 5) {
            CommonFunctions.replaceFragment(getActivity(), new TermsAndConditions(), false);



        }


        lvNavItems.setItemChecked(position, true);
        //lvNavItems.setSelection(position);
        lvNavItems.setSelected(true);
        mDrawerLayout.closeDrawer(fragContainer);


    }
AndiGeeky
  • 11,266
  • 6
  • 50
  • 66
Archana Vetkar
  • 63
  • 2
  • 11

2 Answers2

0

Add onBackPressed() method in activity to check backstack and if entry is more then zero so call popbackstack method.

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() != 0) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }
-1
//Put this in your onNavigationItemSelected of MainActivity

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//FrameLayout where you load your home fragment tools:layout="@layout/frag_home"
ft.replace(R.id.content_frame,nav_selected);
if(getSupportFragmentManager().getBackStackEntryCount() != 0){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    getSupportFragmentManager().popBackStack();
}
//Don't add Home screen
if(id != R.id.nav_home){
    ft.addToBackStack(null);
}
ft.commit();
  • 1
    Why should the OP "try this"? A good answer will always have an explanation of what was done and why it was done in such a manner, not only for the OP but for future visitors to SO. – Rucha Bhatt Joshi Aug 23 '17 at 13:37