Skip to content Skip to sidebar Skip to footer

Single Instance Fragment Back Stack Managerment

I am working on single activity based principle. But I am facing a problem when the same fragment is open again because its again adds in fragment backstack entry. So backstack con

Solution 1:

privatevoidcreateOrResumeFragment(String fragmentTag){
  FragmentManagermanager= getSupportFragmentManager();
  FragmentTransactionft= manager.beginTransaction();
  booleanfragmentPopped= manager.popBackStackImmediate (fragmentTag, 0);
  Fragmentfragment= manager.findFragmentByTag(fragmentTag);
    if(!fragmentPopped && fragment == null){   
      //Create an new instance if it is null and add it to stack 
       fragment = newMyFragment();
       ft.addToBackStack(fragmentTag);
    }
    ft.replace(R.id.framelayout, fragment); 
    ft.commit();
}

Solution 2:

Trying this using the fragment list

See the Answer Here

Initialize the fragments list

staticList<String> fragments = newArrayList<String>();

on Start of first fragment on Activity add this

 if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.frame, new AFragment()).commit();
        fragments.add("package.fragment.AFragment");
    }

Code to fragment change and take in back stack

StringbackStateName= fragment.getClass().getName();
    FragmentManagermanager= getSupportFragmentManager();
    //fragment not in back stack, create it.FragmentTransactionft= manager.beginTransaction();
    if(!fragments.contains(backStateName)) {

       // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);// ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
        ft.replace(R.id.frame, fragment);
        ft.addToBackStack(backStateName);
        ft.commit();

        fragments.add(backStateName);
        System.out.println("backStateName" + fragments);
    }
    else
    {


        ft.replace(R.id.frame, fragment);
        ft.commit();

    }

onBackpressed

@Override
public void onBackPressed() {
    if(fragments.size()>0)
        {
            fragments.remove(fragments.size()-1);
        }
        super.onBackPressed();
}

for back remove stack

final android.app.FragmentManagerfm= getFragmentManager();

    fm.addOnBackStackChangedListener(newandroid.app.FragmentManager.OnBackStackChangedListener() {
        @OverridepublicvoidonBackStackChanged() {

            if (getSupportFragmentManager().getBackStackEntryCount() ==0) {
               // dLayout.closeDrawers();
                finish();
            }
            else
            {
               // dLayout.closeDrawers();

            }
        }
    });

Solution 3:

Before adding or replacing the fragment on backstack, check that if the fragment already in backstack or not.

booleanfragmentPopped= fragmentManager.popBackStackImmediate(backStateName, 0);
if (fragmentPopped) {
   // fragment is popped from backStack
} else {
  // add or replace your fragment here      
}

Solution 4:

publicvoidchangeFragment(Fragment fragment) {
    FragmentManagerfragmentManager= getSupportFragmentManager();
    FragmentcurrentVisibleFragment= fragmentManager.findFragmentById(R.id.container);

    FragmentTransactionfragmentTransaction= fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getSimpleName());
    if (!currentVisibleFragment.getClass().getSimpleName().trim().equalsIgnoreCase(fragment.getClass().getSimpleName().trim())) {
    for (inti= fragmentManager.getBackStackEntryCount() - 1; i > 0; i--) {
        if (fragmentManager.getBackStackEntryAt(i).getName().equalsIgnoreCase(fragment.getClass().getSimpleName())) {
            fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(i).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }

    fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());
    } else {
        fragmentManager.popBackStack();
        fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());
    }
    fragmentTransaction.commit();
}


booleandoubleBackToExitPressedOnce=false;

@OverridepublicvoidonBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        super.onBackPressed();
    } else {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            finish();
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Are you sure you want to exit?", Toast.LENGTH_SHORT).show();

        newHandler().postDelayed(newRunnable() {

            @Overridepublicvoidrun() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }
}

Call the method to replace fragment with single entry in backstack

changeFragment(new YourFragmentClassName());

Post a Comment for "Single Instance Fragment Back Stack Managerment"