2013-04-07 20 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

これはSupportFragmentManagerの非常に単純な解決策です。 FragmentManagerはそれほど便利な、まだ有効ではないです。

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

あなたからすべてのフラグメントを削除する場合現在のフラグがヌルかisDetached()isRemoving()か、またはNullPointerExceptionsになるかどうかを確認することを検討することがあります。

更新6-9-15:getSupportFragmentManger().getFragments()のドキュメントが今明らかにhiddenですが、まだ私のコードではうまく動作します。

enter image description here

更新8-3-15:ここでのドキュメントのスクリーンショットはだあなたは断片のサポートライブラリを使用していない場合は、残念ながらありませんgetFragments()利用可能であるが、それでもいくつかあります、より不便な、オプション。

  1. は、作成時に各fragmenttag又はid与え、そして所望に応じて、それらがそれぞれfragmentを処理する繰り返し処理します。
  2. ので、新しいfragmentたびにactivityに取り付けられている、あなたがそのfragmentを格納し、次いで所望のように各fragmentを処理するためにそのデータ構造を反復することができるonAttachListenerを使用してリスナーを作成します。

getSupportFragmentManager()を使用しない場合は、トランザクションを処理するために、代わりにgetFragmentManager()を使用する必要があります。私の個人的な場合

+0

'getFragments()'メソッドへのリンクを提供できますか? –

+1

@IvanBlack、明らかに利用可能なリンクはありません。私は、この記事を書いたときにドキュメントが利用可能であったと確信していますが、APIはそれが隠されていることを示しています。 – craned

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

は常にあなたのコンテナがフラグメントを持っているかはnull例外

+1

ありがとう! は完全に機能します。 –

-1

がよりシンプルになります場合は、あなたが交換することができます良い検証されますメインのコンテンツは空のフラグメントであるため、メインのアクティビティのみが表示されます。

getFragmentManager() 
.beginTransaction() 
.replace(main_content,new Fragment()) 
.commit(); 
関連する問題