" ( ) backstack", backstack (deque):
class MainActivity extends AppCompatActivity {
private BottomNavigationView navigation;
private Deque<Integer> fragmentIds = new ArrayDeque<>(3);
private FragmentA fragmentA = new FragmentA();
private FragmentB fragmentB = new FragmentB();
private FragmentC fragmentC = new FragmentC();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentIds.push(R.id.navigation_home);
showTabWithoutAddingToBackStack(fragmentA);
navigation = findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(onNavigationItemClicked);
}
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemClicked = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
item.setChecked(true);
int itemId = item.getItemId();
if (fragmentIds.contains(itemId)) {
fragmentIds.remove(itemId);
}
fragmentIds.push(itemId);
showTabWithoutAddingToBackStack(getFragment(item.getItemId()));
return true;
}
};
private Fragment getFragment(int fragmentId) {
switch (fragmentId) {
case R.id.navigation_home:
return fragmentA;
case R.id.navigation_dashboard:
return fragmentB;
case R.id.navigation_notifications:
return fragmentC;
}
return fragmentA;
}
void showTabWithoutAddingToBackStack(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getClass().getSimpleName()).commit();
}
void setBottomTab(int id) {
int itemIndex;
switch (id) {
case R.id.navigation_dashboard:
itemIndex = 1;
break;
case R.id.navigation_notifications:
itemIndex = 2;
break;
default:
case R.id.navigation_home:
itemIndex = 0;
}
navigation.getMenu().getItem(itemIndex).setChecked(true);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
onBackPressed();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
fragmentIds.pop();
if (!fragmentIds.isEmpty()) {
showTabWithoutAddingToBackStack(getFragment(fragmentIds.peek()));
} else {
finish();
}
}
}