linliz
linliz

Reputation: 31

How to Android Navigation drawer exits on Back Button press

I found similar queries asked before and tried some; but not working for me.

I have a main activity with a single fragment container in the layout. I have 3 fragments that will get replaced with the fragment container based on the navigation drawer selection. And I am adding all transactions to back stack.

I wanted to set the activity with Tracker fragment as the home screen so that when user presses back button, he should go to the very first fragment. If he is already in first fragment, thed the application should exit.

Here is my code:

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    fragmentManager = getFragmentManager();
    Fragment fragment;
    switch (position){
        case 0:
            fragment = TrackerFragment.newInstance(position);
            break;

        case 1:
            fragment = CalendarViewFragment.newInstance(position);
            break;
        case 2:
            fragment = SettingsFragment.newInstance(position);

            break;
        default:
            fragment = TrackerFragment.newInstance(position);
    }

    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment).addToBackStack(null)
            .commit();

}

I am not sure how to handle this scenario on OnBackPressed method.What logic should i make. Is there any method to do this without adding to back stack? Any help is really appreciated! Thanks1

Upvotes: 1

Views: 1152

Answers (2)

linliz
linliz

Reputation: 31

private int mCurrentFragmentPosition;
 @Override
public void onNavigationDrawerItemSelected(int position) {

    // update the main content by replacing fragments

    mCurrentFragmentPosition = position;
    fragmentManager = getFragmentManager();
    Fragment fragment;
    switch (position){
        case 0:
            fragment = TrackerFragment.newInstance(position);
            break;

        case 1:
            fragment = CalendarViewFragment.newInstance(position);
            break;
        case 2:
            fragment = SettingsFragment.newInstance(position);

            break;
        default:
            fragment = TrackerFragment.newInstance(position);
    }

    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .commit();

}
@Override
public void onBackPressed() {
    if(mCurrentFragmentPosition != 0){
        onNavigationDrawerItemSelected(0);
    }
    else {
        finish();
    }
}

Upvotes: 2

Bojan Kseneman
Bojan Kseneman

Reputation: 15668

Just keep a track of which is the current shown fragment and override the onBackPressed an act accordingly. Don't need to complicate your life with the backstack :)

int currentFragmentPosition = 0;

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    if(postion == currentFragmentPosition)
    {
       return;
    }
    currentFragmentPosition = position;
    fragmentManager = getFragmentManager();
    Fragment fragment;
    switch (position){
        case 0:
            fragment = TrackerFragment.newInstance(position);
            break;

        case 1:
            fragment = CalendarViewFragment.newInstance(position);
            break;
        case 2:
            fragment = SettingsFragment.newInstance(position);

            break;
        default:
            fragment = TrackerFragment.newInstance(position);
    }

    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment).addToBackStack(null)
            .commit();
}

@Override
public void onBackPressed() {
   if(currentFragmentPostion != 0){
      onNavigationDrawerItemSelected(0);
    }
    else {
      finish();
    }
}

Upvotes: 0

Related Questions