4

を含むアクティビティがありFrameLayoutます。アクティビティには 4 つのステップが表示され、各ステップはFragment. さらに前に戻りたいとき、フラグメントを再作成したくありません。それらを保持し、フラグメント内のビューを単純に置き換えたいと思います。

私は最初にフラグメントを作成し、次のようにバックスタックに追加していました。

Fragment step= new Frag1ActCompleteFragsCommTrack();
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(step, ""+onStepNr);
ft.addToBackStack(null);
ft.commit();

表示されていないことに注意してください。作成してバックスタックに追加するだけです。

framelayoutしたがって、表示するフラグメントの 1 つが必要になったら、それを追加します (この例では、最初の追加であるため、からフラグメントを削除しません)。

FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(R.id.my_frameLayout, step);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

だから:問題は私が得ることです

原因: java.lang.IllegalStateException: Fragment already added: Frag1ActCompleteFragsCommTrack{410dcb20 #0 id=0x7f050041 -1}

しかし、初めてフレームレイアウトに直接追加することはできないと思います。そうしないと、次に交換するときにフラグメントを失う可能性があります。私は正しいですか?それで..フレームレイアウトで互いに交換できるフラグメントを保持するためのベストプラクティスは何ですか?

4

3 に答える 3

4

皆さん、やったー!

を追加しFragment、それを に表示したい場合はframelayout、忘れずに Fragment バックスタックに配置してください。それでおしまい!フレームレイアウトで別のものに置き換えても心配ありません。タグのおかげで元に戻すことができます。実際思ったより簡単だった

//step is an int describing the step associated to the fragment I wanna place
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.replace(R.id.act_complete_track_frameLayout, f, ""+step);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(firstAttach)
    ft.addToBackStack(null);
ft.commit();

タグ「1」のフラグメントが、上記のコードでタグ「2」のフラグメントに置き換えられたと想像してください。ステップ 1 に戻りたい場合は、古いフラグメントを取得してそのコードを再利用します。getSupportFragmentManager().findFragmentByTag("1")

要するに、バックスタックからもFragmentTransaction.replace削除したと思いfragmentました。そうではないようです(幸いなことに)

于 2013-06-18T01:53:41.997 に答える