2012-11-10 22 views
9

私の要件は非常に簡単です:私はFragmentBをFragmentBに置き換えるボタンがあります。FragmentTransaction.removeは効果がありません

これは簡単に聞こえますが、大きな問題は、古い断片が削除されず、古い断片の前に新しいものが配置され、レイアウト内に「生きている」ということです。

enter image description here

コード:

FragmentManager fragMgr = a.getSupportFragmentManager(); 
Fragment currentFragment = (Fragment) fragMgr.findFragmentById(R.id.fragmentitself); 

if(currentFragment!=null){ 

    FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
    fragTrans.remove(currentFragment); 

    FragmentB newFragment = new FragmentB(); 
    fragTrans.replace(R.id.fragmentcontainer, newFragment); 
    // I have also tried with R.id.fragmentitself 
    fragTrans.addToBackStack(null); 
    fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    fragTrans.commit(); 
} 

レイアウト:

<FrameLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="2" 
    android:id="@+id/fragmentcontainer"> 

    <fragment 
     android:id="@+id/fragmentitself" 
     android:name="com.WazaBe.MyApp.FragmentA" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

答えて

14

ソリューション

まず、あなたがXMLからあなたの断片を削除し、ちょうどそこに空の容器を維持する必要があります:

<FrameLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="2" 
    android:id="@+id/fragmentcontainer" /> 

は、その後、あなたは、すなわちあなたの親アクティビティのonCreate()で、コードからあなたのcom.WazaBe.MyApp.FragmentAの断片を追加する必要があります。

説明

の取引に使用すると、FrameLayoutsなどViewGroupを操作するので、それはフラグメントのコンテナであるということです。しかし、フラグメントをXMLレイアウトに直接配置すると、永続のビュー階層になり、永続的なのでコードから削除することはできません。

あなたのレイアウトが固定得れば、remove()コールが不要になった - それはあなたが(そのようでframeLayoutなど)ビューコンテナにフラグメントを配置したい場合は、単にreplace()

+0

作業を!ありがとう。 –

5

を行うには十分であろう、あなたがしなければなりませんコンテナが空であることを確認します(これだけでフラグメントを入れることができます)。XMLファイルで書かれたフラグメントを置き換えることはできません.AをJavaコードでコンテナに追加する必要があります。それをBで置き換えることができます。最初の

、あなたのコンテナがempytです:

<FrameLayout 
android:layout_width="0dp" 
android:layout_height="match_parent" 
android:layout_weight="2" 
android:id="@+id/fragmentcontainer"> 
</FrameLayout> 

OK、あなたはそれにFragmentAを置く:

NOW
FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
fragTrans.remove(currentFragment); 
FragmentA fragA= new FragmentA(); 
fragTrans.add(R.id.fragmentcontainer, fragA).commit(); 

、交換したい場合:

FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
FragmentB newFragment = new FragmentB(); 
fragTrans.replace(R.id.fragmentcontainer, newFragment); 
// I have also tried with R.id.fragmentitself 
fragTrans.addToBackStack(null); 
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
fragTrans.commit(); 
+0

申し訳ありませんが、他の人が速かった、答えにたくさん感謝します。 –

関連する問題