Remove all fragments from container

前端 未结 9 1577
死守一世寂寞
死守一世寂寞 2021-02-01 00:56

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

For example I want to remove all fragments which is added R.id.fragmentcon

相关标签:
9条回答
  • 2021-02-01 01:45

    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.

    0 讨论(0)
  • 2021-02-01 01:48

    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.

    0 讨论(0)
  • 2021-02-01 01:51

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题