9

私の要件は非常に単純です。FragmentA を FragmentB に置き換えるボタンがあります。

これは簡単に聞こえますが、ほとんど機能します。大きな問題は、古いフラグメントが削除されず、新しいフラグメントが古いフラグメントの前に配置され、私のレイアウトで一緒に「生きている」ことです。

ここに画像の説明を入力

コード:

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>
4

4 に答える 4

16

解決

まず、XML からフラグメントを削除し、そこに空のコンテナーを保持する必要があります。

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

com.WazaBe.MyApp.FragmentA次に、コードから、つまりonCreate()親アクティビティにフラグメントを追加する必要があります。

説明

ViewGroupなどの内容を操作する取引を行っているためFrameLayoutsです。問題は、XML レイアウトから拡張されたものはすべて「読み取り専用」と見なされるため、コードから追加した要素のみを操作できることです。したがって、フラグメントを XML レイアウトに直接配置すると、それはビュー階層の永続的な部分になり、永続的であり、階層全体が「読み取り専用」であるため、コードから削除することはできません。

レイアウトを修正して Fragment を抽出すると、remove()呼び出しは不要になります。実行するだけで十分ですreplace()

于 2012-11-10T15:08:09.843 に答える
7

ビューコンテナ(Framelayoutなど)にフラグメントを配置する場合は、コンテナが空であることを確認する必要があります(フラグメントを入れることができるのはこれだけです)。XMLファイルに書き込まれたフラグメントを置き換えることはできません。コンテナにJAVAコードでAを追加する必要があります。IDが必要ない場合は、Bに置き換えることができます。

最初は、コンテナはempytです:

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

OK、FragmentAを入れます:

 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();
于 2012-11-10T15:38:45.937 に答える