ARTICLE AD BOX
I thought my code works well in terms of fragments management because I have tested it manually for a long time. Besides Crashlytics also didn't notify me that users are having any problem with it for a long time, until today. I received a notification with this problem:
Fatal Exception: java.lang.IllegalStateException Fragment already added: FragmentFav{4b16cda}
public class ActivityMain extends AppCompatActivity { (...) private BottomNavigationView bottomNavigationView; private ViewGroup container; private Fragment currFragment; private Fragment bottomNavFragment; private FragmentMain fragmentMain; private FragmentFav fragmentFav; private FragmentSearch fragmentSearch; private FragmentShowNote fragmentShowNote; private FragmentGroup fragmentGroup; @Override protected void onCreate(Bundle savedInstanceState) { (...) setFragments(savedInstanceState); setContentView(R.layout.activity_main); (...) configureBottomNavigationView(); container = findViewById(R.id.content_frame); if (savedInstanceState == null) { currFragment = fragmentMain; bottomNavFragment = fragmentMain; } else { currFragment = getSupportFragmentManager().getFragment(savedInstanceState, "current_fragment"); bottomNavFragment = getSupportFragmentManager().getFragment(savedInstanceState, "bottom_nav_fragment"); } if (savedInstanceState == null) { FragmentTransaction ft = fm.beginTransaction(); ft.add(container.getId(), fragmentMain, "main"); ft.commit(); } (...) } private void setFragments(Bundle savedInstanceState) { if (savedInstanceState == null) { fragmentMain = new FragmentMain(); fragmentFav = new FragmentFav(); fragmentSearch = new FragmentSearch(); fragmentGroup = new FragmentGroup(); fragmentAbout = new FragmentAbout(); } else { fragmentMain = fm.findFragmentByTag("main") != null ? (FragmentMain) fm.findFragmentByTag("main") : new FragmentMain(); fragmentFav = fm.findFragmentByTag("fav") != null ? (FragmentFav) fm.findFragmentByTag("fav") : new FragmentFav(); fragmentSearch = fm.findFragmentByTag("search") != null ? (FragmentSearch) fm.findFragmentByTag("search") : new FragmentSearch(); fragmentGroup = fm.findFragmentByTag("group") != null ? (FragmentGroup) fm.findFragmentByTag("group") : new FragmentGroup(); fragmentAbout = fm.findFragmentByTag("about") != null ? (FragmentAbout) fm.findFragmentByTag("about") : new FragmentAbout(); } } private void configureBottomNavigationView() { bottomNavigationView = findViewById(R.id.bottomNavigation); bottomNavigationView.setOnItemSelectedListener(item -> { FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out); if (item.getItemId() == R.id.action_main) { doOnMainItemSelected(ft); } else if (item.getItemId() == R.id.action_fav) { doOnFavItemSelected(ft); } else if (item.getItemId() == R.id.action_search) { doOnSearchItemSelected(ft); } ft.commit(); return true; }); } private void doOnMainItemSelected(FragmentTransaction ft) { manageOldFragment(ft); ft.show(fragmentMain); doAfterFragmentCommitment(fragmentMain); bottomNavFragment = fragmentMain; } private void doOnFavItemSelected(FragmentTransaction ft) { manageOldFragment(ft); if (fragmentFav.isAdded()) ft.show(fragmentFav); else ft.add(container.getId(), fragmentFav, "fav"); doAfterFragmentCommitment(fragmentFav); bottomNavFragment = fragmentFav; } private void doOnSearchItemSelected(FragmentTransaction ft) { manageOldFragment(ft); if (fragmentSearch.isAdded()) ft.show(fragmentSearch); else ft.add(container.getId(), fragmentSearch, "search"); doAfterFragmentCommitment(fragmentSearch); bottomNavFragment = fragmentSearch; } private void manageOldFragment(FragmentTransaction ft) { if (currFragment instanceof FragmentGroup || currFragment instanceof FragmentShowNote) { ft.remove(currFragment); fm.popBackStack(); } else { ft.hide(currFragment); } } private void doAfterFragmentCommitment(Fragment fragment) { if (fragment instanceof FragmentMain) { currFragment = fragmentMain; } else if (fragment instanceof FragmentFav) { currFragment = fragmentFav; } else if (fragment instanceof FragmentSearch) { currFragment = fragmentSearch; } else if (fragment instanceof FragmentGroup) { currFragment = fragmentGroup; } else if (fragment instanceof FragmentAbout) { currFragment = fragmentAbout; } (...) } @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, "current_fragment", currFragment); getSupportFragmentManager().putFragment(outState, "bottom_nav_fragment", bottomNavFragment); } }As you can see, to avoid this problem I use savedInstanceState, use findFragmentByTag() and use isAdded() where it is possible.
So where can is the problem?
Thank you in advance.
