Reputation: 31
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
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
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