Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling fragment back stack with Navigation Drawer

I am implementing navigation drawer and works well. So i am calling fragment on navigation drawer click and it is also working and further more i am calling another fragment from Home page fragment and maintain the back stack for every fragment but the problem is back press from the child fragment i can't go to Home page fragment and just exited from application. I don't want this. What i want Click on

Navigation Drawer->HomePageFragment->AnotherChild Fragment(On List Item click of HomePageFragment)

but on back pressed without going to Homepage fragment its directly exit with application. Here is my code: (In Fragment Activity with Navigation Drawer)

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

        updateDisplay(position);
    }

}

private void updateDisplay(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new ScheduleFragment();
        break;
    case 1:
        fragment = new Result_Fragment();
        break;
    case 2:
        fragment = new Live_Match_Fragment();
        break;
    case 3:
        // fragment = new Live_Match_Fragment();
        break;

    case 4:
        fragment = new Team_Fragment();
        break;
    default:
        break;
    }

    if (fragment != null) {

        fragmentManager = getFragmentManager();
        fragmentManager.popBackStackImmediate("0", 0);
        int count = fragmentManager.getBackStackEntryCount();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.frame_container, fragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .addToBackStack(String.valueOf(count)).commit();
        Log.e("Count in Activiy", ""+count);

        // update selected item and title, then close the drawer
        setTitle(menutitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

}

Now in BackPressed() in FragmentActivity.

@Override
public void onBackPressed() {
    if (fragmentManager.getBackStackEntryCount() <= 1) {
        finish();

        return;
    }
    super.onBackPressed();
}

Now calling another child fragment from HomePage fragment on Listview item click.

 team_lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            TeamDetailFragment myDetailFragment = new TeamDetailFragment();
            FragmentManager fragmentManager = getFragmentManager();
            int count = fragmentManager.getBackStackEntryCount();
            Log.e("Count in Fragment", "" + count);
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            fragmentTransaction
                    .replace(R.id.frame_container, myDetailFragment)
                    .setTransition(
                            FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(String.valueOf(count)).commit();

        }
    });

So anybody knows then help me. Help will be appreciate.

like image 458
Piyush Avatar asked Apr 25 '14 12:04

Piyush


2 Answers

There is an issue with nested fragments in android https://code.google.com/p/android/issues/detail?id=40323

Android doesn't handle back press well if transactions were in nested fragments. To surpass this i am using the following fix inside My Activity

@Override
public void onBackPressed() {
    // If the fragment exists and has some back-stack entry
    if (myFragment != null && myFragment.getChildFragmentManager().getBackStackEntryCount() > 0) {
        // Get the fragment fragment manager - and pop the backstack
        myFragment.getChildFragmentManager().popBackStack();
    }
    // Else, nothing in the direct fragment back stack
    else {
        // Let super handle the back press
        super.onBackPressed();
    }
}
like image 103
Rostislav Pashuto Avatar answered Oct 24 '22 12:10

Rostislav Pashuto


I've solved in the following way:

1st solution

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount > 1) {
        super.onBackPressed();
    } else {
        finish();
    }
}

2nd solution

@Override
public void onBackStackChanged() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount == 0) {
        finish();
    }
}

These allow you to exploit the Android stack when you replace your fragment:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, yourFragment)
    .addToBackStack(null).commit();
like image 30
f_ficarola Avatar answered Oct 24 '22 12:10

f_ficarola