2015-10-20 74 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