2013-04-07 47 views
32
FragmantClass rSum = new FragmantClass(); 
getSupportFragmentManager().beginTransaction().remove(rSum).commit();  

我想刪除這個片段,當我加載切換另一個片段。上面的片段不會被刪除。這是我打電話切換片段的方法。從活動中刪除片段

public void switchContent(Fragment fragment) { 
    FragmantClass rSum = new FragmantClass(); 
    getSupportFragmentManager().beginTransaction().remove(rSum).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 

回答

39
getSupportFragmentManager().beginTransaction(). 
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 

試試這個,它應該工作。

public void switchContent(Fragment fragment) { 
    getSupportFragmentManager().beginTransaction(). 
    remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 
7

這是一個非常簡單的解決方案SupportFragmentManagerFragmentManager是不是很方便,但仍然有效:

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
// You might have to access all the fragments by their tag, 
// in which case just follow the line below to remove the fragment 
if (fragmentList == null) { 
    // code that handles no existing fragments 
} 

for (Fragment frag : fragmentList) 
{ 
    // To save any of the fragments, add this check 
    // a tag can be added as a third parameter to the fragment when you commit it 
    if (frag.getTag().equals("<tag-name")) { 
     continue; 
    } 

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

,或者,如果你不得不使用它(但不推薦):

.commitAllowingStateLoss(); 

如果你從拆除所有片段該視圖多次,你可能會考慮檢查,如果當前的frag爲空或isDetached()isRemoving()或者你可能會得到一個NullPointerExceptions

更新15年6月9日:getSupportFragmentManger().getFragments()文檔顯然是hidden了,但仍然工作就好在我的代碼。下面是對文件的截圖:

enter image description here

更新15年8月3日:如果你不使用的片段支持庫,不幸的是沒有getFragments()可用,但仍有一對夫婦,更不方便的選擇。

  1. 給每個fragment一個在創建時tagid,並遍歷它們,以根據需要處理每個fragment
  2. 創建使用onAttachListener所以每當一個新fragment附接到activity時間的監聽器,則可以存儲fragment,然後通過該數據結構迭代根據需要來處理每個fragment

當不使用getSupportFragmentManager()時,要處理事務,您需要改爲使用getFragmentManager()

+0

您能否提供'getFragments()'方法的鏈接? – 2015-06-07 14:02:42

+1

@IvanBlack,顯然沒有可用的鏈接。我相信當我寫這篇文章的時候它的文檔可用,但是API顯示它已經隱藏,認爲它仍然有效。 – craned 2015-06-09 16:09:49

10

就我個人而言,我添加和刪除片段是這樣的:

if(getSupportFragmentManager().findFragmentById(R.id.container) != null) { 
     getSupportFragmentManager() 
       .beginTransaction(). 
       remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit(); 
    } 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.container, fragment) 
      .commit(); 

始終是好的驗證,如果你的容器有一個片段或將有一個空的異常

+1

謝謝你! 完美運作。 – 2016-09-21 22:31:44

-1

更簡單,可以更換帶有空片段的主要內容,以便僅查看主要活動。

getFragmentManager() 
.beginTransaction() 
.replace(main_content,new Fragment()) 
.commit();