web-dev-qa-db-ja.com

プログラムでフラグメントを置き換える

下の図に示すように、3つのフラグメントがあります。 .xmlファイルを使用してこれら3つのフラグメントすべてをLinearLayoutに追加し、ランチャーアクティビティが開始したら、setContentViewを使用してその.xmlレイアウトをロードします。

fragment2をいくつか制御しています。いずれかをクリックすると、FragmentTransactionおよびcommitメソッドを使用して、fragment4がプログラムによって読み込まれます。このフラグメントは画面に追加されますが、問題は、プログラムで追加されたフラグメント4が画面領域全体を占めることです。何が問題なのでしょうか?

注:f2で任意の項目をクリックします。f2のみを新しいフラグメントf4に置き換えます。 xmlレイアウトファイルを通じてf1、f2、f3を追加し、プログラムで新しいフラグメントf4を追加したことを覚えておいてください。

enter image description here

20
VishalSoni

常にプログラムでフラグメントを追加、削除、置換する必要があります。そのため、F-1、F-2、F-3フラグメントをFrameLayoutなどのコンテナーに置き換えることをお勧めします。

基本的に<fragment/>要素をF-1として、それを<FrameLayout/>要素。次に、FragmentActivityのonCreateでフラグメントトランザクションを実行します。

Fragment1 f1 = new Fragment1();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();  

ここで、F-1、F-2、F-3についてこれを行ったとします。次に、OnClickListenerで同じことをもう一度実行して、f2をf4に置き換えます。

public void onClick(View v) {
    Fragment4 f4 = new Fragment4();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();   
}
34
CodePrimate

XMLのフラグメントのプレースホルダーとしてFrameLayoutのみを保持します。 OnCreateで、フレームレイアウトにフラグメントをロードします。フラグメントのOnClickで、その特定のFrameLayoutのIDを指定して、Fragment4に置き換えます。

2
user936414