Fragment re-created on bottom navigation view item selected

后端 未结 15 2547
长发绾君心
长发绾君心 2020-12-07 23:55

Following is my code for bottom navigation view item selected

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationI         


        
15条回答
  •  失恋的感觉
    2020-12-08 00:47

    This seemed to work well for me. Instead of attaching and detaching, i use show or hide to maintain fragment state.

        public void changeFragment(Fragment fragment, String tagFragmentName) {
    
            FragmentManager mFragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
    
            Fragment currentFragment = mFragmentManager.getPrimaryNavigationFragment();
            if (currentFragment != null) {
                fragmentTransaction.hide(currentFragment);
            }
    
            Fragment fragmentTemp = mFragmentManager.findFragmentByTag(tagFragmentName);
            if (fragmentTemp == null) {
                fragmentTemp = fragment;
                fragmentTransaction.add(R.id.frame_layout, fragmentTemp, tagFragmentName);
            } else {
                fragmentTransaction.show(fragmentTemp);
            }
    
            fragmentTransaction.setPrimaryNavigationFragment(fragmentTemp);
            fragmentTransaction.setReorderingAllowed(true);
            fragmentTransaction.commitNowAllowingStateLoss();
        }
    

    And this is how i use it

         private void initViews() {
            BottomNavigationView bottomNavigationView = findViewById(R.id.navigation);
            bottomNavigationView.setOnNavigationItemSelectedListener
                    (new BottomNavigationView.OnNavigationItemSelectedListener() {
                        @Override
                        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                            Fragment selectedFragment = null;
                            switch (item.getItemId()) {
                                case R.id.explore:
                                    changeFragment(new ExploreFragment(), ExploreFragment.class
                                            .getSimpleName());
                                    toggleViews(true, "");
                                    break;
                                case R.id.favorite:
                                    changeFragment(new FavoriteFragment(), FavoriteFragment.class
                                            .getSimpleName());
                                    toggleViews(false, "Favorites");
                                    break;
                                case R.id.venue:
                                    changeFragment(new VenueFragment(), VenueFragment.class.getSimpleName());
                                    toggleViews(false, "Venues");
                                    break;
                                case R.id.profile:
                                    changeFragment(new ProfileFragment(), ProfileFragment.class
                                            .getSimpleName());
                                    toggleViews(false, "Profile");
                                    break;
                            }
                            return true;
                        }
                    });
    
            //Manually displaying the first fragment - one time only
            changeFragment(new ExploreFragment(), ExploreFragment.class
                    .getSimpleName());
    
        }
    

提交回复
热议问题