2015-10-20 93 views
9

有没有一种方法可以删除所有已添加特定视图及其视图ID的片段?删除容器中的所有片段

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

感谢,

+0

的可能的复制[片段:在一个视图中删除所有片段](http://stackoverflow.com/questions/14764043/fragments-remove -all-fragments-in-a-view) – ThomasThiebaud

回答

28

你可以试试下面的代码

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

*断枝是要删除片段的对象。

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

它将删除“your_container”容器中的片段。

HapPy编码。

+0

我如何确定frag对象容器视图是R.id.mycontainer? –

+0

这只是给你参考,你可以用你的ID替换。 –

+0

谢谢@ user1632209 –

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(); 
    } 
} 

我已经使用这个在生产中使用多年的方法,它的作用就像魅力。如果您有任何问题,请告诉我。通过所有的片段

+0

,谢谢:) –

7

它非常简单只是循环,将其取下

for(Fragment fragment:getSupportFragmentManager().getFragments()){ 

    getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
} 

抽屉式导航的情况下一定要检查它,如果你尝试删除它,你会得到错误。做任何片段交易

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

谢谢。什么是“NavigationDrawerFragment”?这将是有用的,但我认为,它来自一些图书馆。 – CoolMind

+0

NavigationDrawerFragment只是作为导航器抽屉添加的片段。这不是来自任何其他图书馆。 –

+0

我面临的情况是,FragmentTransaction'add'创建了一个普通的片段,而'replace'使得它上面的高工具栏(在棒棒糖上,带有导航抽屉)。也许你是对的,最好是创建一个虚拟片段并“添加”其他人。你有没有这样做? – CoolMind

2

这的确是很简单的前

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

最后,但很重要的一定要检查空。

private static void removeAllFragments(FragmentManager fragmentManager) { 
    while (fragmentManager.getBackStackEntryCount() > 0) { 
     fragmentManager.popBackStackImmediate(); 
    } 
} 
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(); 
} 
+0

这种检查是不必要的: “if(manager.getBackStackEntryCount()> 0){” 因为它永远不会传递无论如何,如果这是错误的循环。 – Erik