从容器中删除所有碎片

Ali*_*lli 33 android android-fragments

有没有办法删除已添加特定视图及其视图ID的所有片段?

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

谢谢,

小智 49

它非常简单,只需循环遍历所有碎片并将其移除

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
Run Code Online (Sandbox Code Playgroud)

但是如果导航抽屉一定要检查它,如果你试图删除它,你会收到错误.

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

最后但非常重要的是确保在执行任何片段事务之前检查null

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

  • 请注意,这将删除给定片段管理器中的**ALL**片段.不只是在OP所要求的特定布局容器中 (4认同)

Rhn*_*ani 38

你可以尝试下面的代码

getSupportFragmentManager().beginTransaction().remove(frag).commit(); 
Run Code Online (Sandbox Code Playgroud)

*frag是要删除的片段的对象.

 OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();
Run Code Online (Sandbox Code Playgroud)

它将删除在"your_container"容器中编码的片段.

HapPy编码.

  • 这是一种错误的做法.问题不是如何删除一个片段,而是如何删除所有片段. (13认同)

Dev*_*ath 10

如果有人在 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)
}
Run Code Online (Sandbox Code Playgroud)


小智 7

这确实非常简单.

private static void removeAllFragments(FragmentManager fragmentManager) {
    while (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStackImmediate();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 仅在将片段添加到堆栈中时才有效 (2认同)

Vla*_*lad 5

更优化的版本
不需要多次调用提交,所以让我们在最后调用一次

supportFragmentManager.fragments.let {
    if (it.isNotEmpty()) {
        supportFragmentManager.beginTransaction().apply {
            for (fragment in it) {
                remove(fragment)
            }
            commit()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)