有没有办法删除已经添加了具有视图ID的特定视图的所有片段?
例如,我想删除所有添加了R.id.fragmentcontainer视图的片段。
谢谢,
答案 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)。