kokoko
kokoko

Reputation: 3984

Remove all fragments from container

Is there a way to remove all fragments which are already added the specific view with its view id?

For example I want to remove all fragments which are added into R.id.fragmentcontainer view.

Upvotes: 67

Views: 99893

Answers (10)

Nabeel
Nabeel

Reputation: 1001

Here is much simplier way to clear all fragments from Fragment Container View

view.findViewById(R.id.fragmentcontainer).removeAllViews()

if you are using viewbinding then

binding.fragmentcontainer.removeAllViews()

Upvotes: 2

Semyon Tikhonenko
Semyon Tikhonenko

Reputation: 4262

This Kotlin extension does the job:

fun FragmentManager.removeAll(containerId: Int) {
    beginTransaction().apply {
        fragments.filter {
            it.id == containerId
        }.forEach {
            remove(it)
        }
    }.commit()
}

Upvotes: 2

Devrath
Devrath

Reputation: 42834

In case someone is looking for a code in Kotlin:

supportFragmentManager.apply {
        for (fragment in fragments) {
           beginTransaction().remove(fragment).commit()
        }
        popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    }

Upvotes: 16

remain4life
remain4life

Reputation: 1311

As an addition to useful answers I have to say that if you have added few fragments to specific view container, for example:

getSupportFragmentManager()
    .beginTransaction()
    .add(containerViewId, fragmentA)
    .add(containerViewId, fragmentB)
    .commit();

and if you need just replace them by one, you can simply call replace without removing fragmentA and fragmentB

getSupportFragmentManager()
    .beginTransaction()
    .replace(containerViewId, fragment)
    .commit();

According to the docs replace removes all fragments before adding new:

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

Upvotes: 1

Sumit Saxena
Sumit Saxena

Reputation: 1187

Its very simple just loop through all the fragments and remove it

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}

But in case of Navigation Drawer be sure to check it, if you try to remove it you will get error.

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
  if (fragment instanceof NavigationDrawerFragment) {
      continue;
  }
  else { 
      getSupportFragmentManager().beginTransaction().remove(fragment).commit();
  }
}

Last but very important be sure to check for null before doing any fragment transactions

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    if (fragment instanceof NavigationDrawerFragment) {
        continue;
    }
    else if (fragment != null) {
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();
    }
}

Upvotes: 99

Vlad
Vlad

Reputation: 8552

More optimized version
There is no need in multiple call of commit so lets call it one time at the end

supportFragmentManager.fragments.let {
    if (it.isNotEmpty()) {
        supportFragmentManager.beginTransaction().apply {
            for (fragment in it) {
                remove(fragment)
            }
            commit()
        }
    }
}

Upvotes: 7

Ajay Nishad
Ajay Nishad

Reputation: 391

Use this code

activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
        it.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
}

Hope it helps.

Thank you.

Upvotes: 4

Gian_DC
Gian_DC

Reputation: 21

Try this, hope it helps :D

try {
if(manager.getFragments()!=null){
    if(manager.getBackStackEntryCount()>0) {
        for (int i = 0; i < manager.getBackStackEntryCount(); i++)
            manager.popBackStack();

        manager.beginTransaction().remove(getSupportFragmentManager()
        .findFragmentById(R.id.main_content))
        .commit();
        }
    }
}catch (Exception e){
    e.printStackTrace();
} 

Upvotes: 2

Jaap-Jan Hellinga
Jaap-Jan Hellinga

Reputation: 167

It is indeed very simple.

private static void removeAllFragments(FragmentManager fragmentManager) {
    while (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStackImmediate();
    }
}

Upvotes: 8

Vingtoft
Vingtoft

Reputation: 14636

Save all your fragments in an ArrayList.

Initializing:

List<Fragment> activeCenterFragments = new ArrayList<Fragment>();

Adding fragment to list:

private void addCenterFragments(Fragment fragment) {
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.empty_center_layout, fragment);
    activeCenterFragments.add(fragment);
    fragmentTransaction.commit();
}

When you want to remove all them, do the following:

private void removeActiveCenterFragments() {
    if (activeCenterFragments.size() > 0) {
        fragmentTransaction = fragmentManager.beginTransaction();
        for (Fragment activeFragment : activeCenterFragments) {
            fragmentTransaction.remove(activeFragment);
        }
        activeCenterFragments.clear();
        fragmentTransaction.commit();
    }
}

I have used this method in production for years, and it works like a charm. Let me know if you have any questions.

Upvotes: 2

Related Questions