从容器中删除所有碎片

时间:2015-10-20 12:54:16

标签: android fragment

有没有办法删除已经添加了具有视图ID的特定视图的所有片段?

例如,我想删除所有添加了R.id.fragmentcontainer视图的片段。

谢谢,

9 个答案:

答案 0 :(得分:36)

您可以尝试以下代码

getSupportFragmentManager().beginTransaction().remove(frag).commit(); 

* frag 是您要删除的片段的对象。

 OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();

它将删除在" your_container"中删除的片段。容器

HapPy编码。

答案 1 :(得分:35)

它非常简单地循环遍历所有片段并将其删除

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

但是如果导航抽屉请务必检查它,如果您尝试删除它,则会收到错误。

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

最后但非常重要请务必在执行任何片段事务之前检查null

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

答案 2 :(得分:6)

确实非常简单。

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

答案 3 :(得分:3)

将所有片段保存在ArrayList中。

初​​始化:

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

将片段添加到列表中:

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

如果要删除所有,请执行以下操作:

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

我已经在生产中使用这种方法多年了,它就像一个魅力。如果您有任何问题,请告诉我。

答案 4 :(得分:2)

万一有人在Kotlin中寻找代码,

private fun clearFragmentsFromContainer() {
            val fragments = supportFragmentManager.fragments
            if (fragments != null) {
                for (fragment in fragments) {
                    supportFragmentManager.beginTransaction().remove(fragment).commit()
                }
            }
            //Remove all the previous fragments in back stack
            supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}

答案 5 :(得分:1)

更多优化版本
不需要多次调用commit,所以最后一次调用一次

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

答案 6 :(得分:0)

试试这个,希望它有所帮助: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();
} 

答案 7 :(得分:0)

使用此代码

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

希望有帮助。

谢谢。

答案 8 :(得分:0)

作为有用答案的补充,我不得不说,如果您向特定的视图容器中添加了一些片段,例如:

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

,如果只需要将它们替换为一个,则只需调用replace,而无需删除 fragmentA fragmentB

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

根据docs replace删除所有片段,然后添加新片段:

替换添加到容器中的现有片段。这是 本质上与当前所有调用remove(Fragment)相同 添加了使用相同containerViewId添加的片段,然后 使用此处给出的相同参数添加(int,Fragment,String)。