Finally, I found a solution, it was inspired by a previous answer on StackOverflow: Separate back stack for each tab on Android with snippets
I just replaced TabHost with BottomNavigationView and here is the code:
Primary activity
public class MainActivity extends AppCompatActivity { private HashMap<String, Stack<Fragment>> mStacks; public static final String TAB_HOME = "tab_home"; public static final String TAB_DASHBOARD = "tab_dashboard"; public static final String TAB_NOTIFICATIONS = "tab_notifications"; private String mCurrentTab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); mStacks = new HashMap<String, Stack<Fragment>>(); mStacks.put(TAB_HOME, new Stack<Fragment>()); mStacks.put(TAB_DASHBOARD, new Stack<Fragment>()); mStacks.put(TAB_NOTIFICATIONS, new Stack<Fragment>()); navigation.setSelectedItemId(R.id.navigation_home); } private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: selectedTab(TAB_HOME); return true; case R.id.navigation_dashboard: selectedTab(TAB_DASHBOARD); return true; case R.id.navigation_notifications: selectedTab(TAB_NOTIFICATIONS); return true; } return false; } }; private void gotoFragment(Fragment selectedFragment) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.content, selectedFragment); fragmentTransaction.commit(); } private void selectedTab(String tabId) { mCurrentTab = tabId; if(mStacks.get(tabId).size() == 0){ if(tabId.equals(TAB_HOME)){ pushFragments(tabId, new HomeFragment(),true); }else if(tabId.equals(TAB_DASHBOARD)){ pushFragments(tabId, new DashboardFragment(),true); }else if(tabId.equals(TAB_NOTIFICATIONS)){ pushFragments(tabId, new NotificationsFragment(),true); } }else { pushFragments(tabId, mStacks.get(tabId).lastElement(),false); } } public void pushFragments(String tag, Fragment fragment, boolean shouldAdd){ if(shouldAdd) mStacks.get(tag).push(fragment); FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.content, fragment); ft.commit(); } public void popFragments(){ Fragment fragment = mStacks.get(mCurrentTab).elementAt(mStacks.get(mCurrentTab).size() - 2); mStacks.get(mCurrentTab).pop(); FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.content, fragment); ft.commit(); } @Override public void onBackPressed() { if(mStacks.get(mCurrentTab).size() == 1){
}
Home Fragment Example
public class HomeFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); Button gotoNextFragment = (Button) view.findViewById(R.id.gotoHome2); gotoNextFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ((MainActivity)getActivity()).pushFragments(MainActivity.TAB_HOME, new Home2Fragment(),true); } }); return view; }
}
source share