How to keep only one instance of a fragment, when switching with NavigationDrawer?

后端 未结 4 418

My App starts with a AddressFragment. From the NavigationDrawer I start (amongst others) a new AddressFragment with:

getSupportFragmentManag         


        
4条回答
  •  悲&欢浪女
    2020-12-05 16:02

    This is tested answer, Hope this will help you First Make these field globally in MainActivity

    private static final int TIME_INTERVAL = 2000; 
    private long mBackPressed;
    private FragmentManager fm;
    private FragmentTransaction ft;
    private DrawerLayout drawer;
    

    Now in onNavigationItemSelected() implement like that

        @Override
    public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment = null;
    Class fragmentClass = null;
    switch (item.getItemId()) {
    case R.id.nav_home:
    fragmentClass = Fragment.class;//this is MainAvctivty extends AppCompatActivity
    break;
    case R.id.nav_f1:
    fragmentClass = FragmentOne.class;
    break;
    case R.id.nav_f2:
    fragmentClass = FragmentTwo.class;
    break;
    case R.id.nav_f3:
    fragmentClass = FragmentThree.class;
    break;
    case R.id.nav_f4:
    fragmentClass = FragmentFour.class;
    break;
    case R.id.nav_f5:
    fragmentClass = FragmentFive.class;
    break;
    default:
    fragmentClass = Fragment.class;
    }
    try {
    fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {e.printStackTrace();}
    //Insert the fragment by replacing any existing fragment
    fm = getSupportFragmentManager();
    ft = fm.beginTransaction();
    ft.replace(R.id.frame_container, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();
    item.setChecked(true);
    setTitle(item.getTitle());
    drawer.closeDrawers();
    return true;
    }
    

    Now handle onbackpressed like below

    @Override
    public void onBackPressed() {
    if (drawer != null) {
    fm = getSupportFragmentManager();
    ft = fm.beginTransaction();
    if (drawer.isDrawerOpen(GravityCompat.START)) {
    drawer.closeDrawer(GravityCompat.START);
    } else if (fm.getBackStackEntryCount() > 0) {
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
    ft.commit();
    } else if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) {
    super.onBackPressed();
    } else {
    Toast.makeText(this,"Press again to exit the app",Toast.LENGTH_SHORT).show();
    }
    mBackPressed = System.currentTimeMillis();
    }
    }
    

提交回复
热议问题