Remove old Fragment from fragment manager

AndroidAndroid FragmentsAndroid Tabhost

Android Problem Overview


I'm trying to learn how to use Fragments in android. I'm trying to remove old fragment when new fragment is calling in android.

Android Solutions


Solution 1 - Android

You need to find reference of existing Fragment and remove that fragment using below code. You need add/commit fragment using one tag ex. "TAG_FRAGMENT".

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
	getSupportFragmentManager().beginTransaction().remove(fragment).commit();

That is it.

Solution 2 - Android

If you want to replace a fragment with another, you should have added them dynamically, first of all. Fragments that are hard coded in XML, cannot be replaced.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

Refer this post: https://stackoverflow.com/questions/5658675/replacing-a-fragment-with-another-fragment-inside-activity-group

Refer1: https://stackoverflow.com/questions/10122570/replace-a-fragment-programmatically

Solution 3 - Android

I had the same issue to remove old fragments. I ended up clearing the layout that contained the fragments.

LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...

I do not know if this creates leaks, but it works for me.

Solution 4 - Android

I had the same issue. I came up with a simple solution. Use fragment .replace instead of fragment .add. Replacing fragment doing the same thing as adding fragment and then removing it manually.

getFragmentManager().beginTransaction().replace(fragment).commit();

instead of

getFragmentManager().beginTransaction().add(fragment).commit();

Solution 5 - Android

Probably you instance old fragment it is keeping a reference. See this interesting article [Memory leaks in Android — identify, treat and avoid][1]

If you use addToBackStack, this keeps a reference to instance fragment avoiding to Garbage Collector erase the instance. The instance remains in fragments list in fragment manager. You can see the list by

ArrayList<Fragment> fragmentList = fragmentManager.getFragments();

The next code is not the best solution (because don´t remove the old fragment instance in order to avoid memory leaks) but removes the old fragment from fragmentManger fragment list

int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);

You cannot remove the entry in the arrayList because apparenly FragmentManager works with index ArrayList to get fragment.

[1]: https://medium.com/freenet-engineering/memory-leaks-in-android-identify-treat-and-avoid-d0b1233acc8 "Memory leaks in Android — identify, treat and avoid"

I usually use this code for working with fragmentManager

public void replaceFragment(Fragment fragment, Bundle bundle) {

    if (bundle != null)
        fragment.setArguments(bundle);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());

    //if oldFragment already exits in fragmentManager use it
    if (oldFragment != null) {
        fragment = oldFragment;
    }

    fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());

    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

    fragmentTransaction.commit();
}

Solution 6 - Android

I had issue with onBackPress. i did'nt want to return to old fragments.

This is worked for me to remove old fragments from fragment manager :

FragmentManager fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

You can also use an if block like this :

FragmentManager fm = getSupportFragmentManager();

if (fm.getBackStackEntryCount() > 0) {
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

Solution 7 - Android

In Kotlin

  val fragList  = f.supportFragmentManager.fragments
    for (fragment in fragList) {
        f.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionkhouloud mejdoubView Question on Stackoverflow
Solution 1 - AndroidYashdeep PatelView Answer on Stackoverflow
Solution 2 - AndroidLokeshView Answer on Stackoverflow
Solution 3 - AndroidAlexanderView Answer on Stackoverflow
Solution 4 - AndroidAvinash MaliView Answer on Stackoverflow
Solution 5 - AndroidArgongaView Answer on Stackoverflow
Solution 6 - AndroidGhazalView Answer on Stackoverflow
Solution 7 - AndroidJayesh DankharaView Answer on Stackoverflow