Android 从容器中取出所有碎片

Android 从容器中取出所有碎片,android,android-fragments,Android,Android Fragments,是否有方法删除已添加具有视图id的特定视图的所有片段 例如,我想删除添加到R.id.fragmentcontainer视图中的所有片段。您可以尝试下面的代码 getSupportFragmentManager().beginTransaction().remove(frag).commit(); *frag是要删除的片段对象 OR getFragmentManager().beginTransaction().remove(getFragmentManager().findFragment

是否有方法删除已添加具有视图id的特定视图的所有片段

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

您可以尝试下面的代码

getSupportFragmentManager().beginTransaction().remove(frag).commit(); 
*frag是要删除的片段对象

 OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();
它将移除存放在“your_container”容器中的碎片


愉快的编码。

将所有片段保存在ArrayList中

初始化:

List<Fragment> activeCenterFragments = new ArrayList<Fragment>();
如果要删除所有它们,请执行以下操作:

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

我已经在生产中使用这种方法多年了,效果非常好。如果您有任何问题,请告诉我。

很简单,只需遍历所有片段并将其删除即可

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();
  }
}
最后一个但非常重要的在执行任何片段事务之前,请确保检查空值

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

其实很简单

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

试试这个,希望对你有帮助

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();
} 
试试看{
if(manager.getFragments()!=null){
if(manager.getBackStackEntryCount()>0){
对于(int i=0;i
使用此代码

activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
        it.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
}
希望能有帮助


谢谢。

如果有人在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)
}
更优化的版本
不需要多次调用commit,所以让我们在最后调用它一次

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

作为对有用答案的补充,我必须指出,如果您向特定视图容器添加了一些片段,例如:

getSupportFragmentManager()
    .beginTransaction()
    .add(containerViewId, fragmentA)
    .add(containerViewId, fragmentB)
    .commit();
如果您只需要将它们替换为一个,您只需调用
replace
,而无需删除fragmentA和fragmentB

根据
replace
在添加新代码之前删除所有片段:

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


我如何才能确保frag objects容器视图是R.id.mycontainer?这只是供您参考的,您可以用您的id替换。这是一种错误的方法。问题不在于如何删除一个片段,而在于如何删除所有片段。@vingtof它的使用:FragmentManager FragmentManager=MainActivity.activity.getSupportFragmentManager();对于(inti=0;iadd创建一个普通片段,而
replace
在它上面创建了一个高高的工具栏(在Lollipop,带有导航抽屉)。也许你是对的,最好创建一个虚拟片段并添加其他片段。你这样做了吗?是的,我总是喜欢添加片段作为导航抽屉,它提供了对设计和更改软件的更多控制,这将删除给定片段管理器中的所有片段。不仅仅是在OP询问的特定布局容器中,此检查是不必要的:“if(manager.getBackStackEntryCount()>0){”因为如果此值为false,它将永远不会在for循环上运行传递。这仅在片段被添加到backbackback时有效。如果在应用程序被终止后状态已恢复,则此操作将不起作用,因为列表将为空。这不是正确的方法。因为您无法从容器中删除所有片段。您只能从e最后添加的后堆栈
getSupportFragmentManager()
    .beginTransaction()
    .add(containerViewId, fragmentA)
    .add(containerViewId, fragmentB)
    .commit();
getSupportFragmentManager()
    .beginTransaction()
    .replace(containerViewId, fragment)
    .commit();