3

レイアウトに Button と FrameLayout を持つ Activity があります。ボタンをクリックすると、フラグメントがアクティビティのビューに追加されます。フラグメントをバック スタックに追加すると、addToBackStack()[戻る] ボタンをクリックすると消えます。ボタンをもう一度クリックして、同じ機能を実現したいと考えています。

私のコードはこれです:

     button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {

             AddRemoveFragment Frag_A = new AddRemoveFragment();

             FragmentManager fm1 = getSupportFragmentManager();
             FragmentTransaction transaction = fm1.beginTransaction();

        if ( state == 0 ) {
                 Log.i(TAG, "inside IF");
                 state=1;
                 transaction.add(R.id.fragment_container_1, Frag_A);
                 transaction.addToBackStack(null);
                 transaction.commit();

             } else {
                 state=0;
                 Log.i(TAG, "inside ELSE");
                 //transaction.replace(R.id.fragment_container_1, Frag_A);
                     transaction.remove(Frag_A);
                 transaction.commit();
             }

         }
     });

両方とも何もremove()hide()ません。参照から、私はより具体的なことを理解していません。コンテナからフラグメントを削除すると言うだけです。これは私が望むものではありませんか?FrameLayout からフラグメントを削除しますか?

編集:サポートライブラリとは何の関係もないことを願っています。私はそれでいくつかの問題を抱えている人を見ました。ここ

XML :

<?xml version="1.0" encoding="utf-8"?>

<Button
    android:id="@+id/button_frag_1"
    android:layout_width="124dp"
    android:layout_height="wrap_content"
    android:text="@string/button_text_1" />

<FrameLayout
    android:id = "@+id/fragment_container_1"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/button_frag_1"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/button_frag_1" >
</FrameLayout>

編集 2:elseステートメント内のコードを から に変更しtransaction.replace(R.id.fragment_container_1, Frag_A);ましtransaction.remove(Frag_A);たが、それでも同じ機能が得られます。

4

1 に答える 1

3

フラグメントについては、まず 1 つのことを覚えておく必要があります。フラグメントを XML レイアウトに追加した場合、それを削除することはできません。メソッドを使用してのみ表示でき、.show()メソッドを使用して非表示にすることができ.hide()ます。一方、コードでフラグメントのインスタンスを作成する場合は、 メソッドを使用して追加する.add()か、 メソッドを使用して削除する必要があり.remove()ます。

あなたの質問に関しては、ボタンを使用してフラグメントを削除する場合は、フラグメントをバックスタックに追加する必要はないと思います(「戻る」ボタンを使用してフラグメントを削除する機能を維持したい場合を除く)。

さらに、 replaceのドキュメントから、 replace を使用する必要はないと思います:

コンテナに追加された既存のフラグメントを置き換えます。これは、同じ containerViewId で追加された現在追加されているすべてのフラグメントに対して remove(Fragment) を呼び出してから、ここで指定された同じ引数で add(int, Fragment, String) を呼び出すことと基本的に同じです。

これは、コンテナーのコンテンツを新しいフラグメントに置き換えることを意味するため、フラグメントを削除して再度追加するだけです。

.add()表示したいときはフラグメント化し、表示したくないときはフラグメント化する必要があります.remove()

アップデート:

2 番目の質問に続いて、xml にフラグメントを追加できると言うときは、次のように記述できることを意味します。

<fragment
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/listfragment"
    android:name="com.eadesign.yamba.TimeLineListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

フラグメント コンテナである FrameLayout 内の XML レイアウト ファイルでは、この場合、このフラグメントを削除することはできず、非表示にすることしかできません。

明確にするために、フラグメント/フラグメントのコンテナとなるある種のレイアウトを常に提供する必要があります。

それとは反対に、コードで行っていることを実行できます。

AddRemoveFragment Frag_A = new AddRemoveFragment();
transaction.add(R.id.fragment_container_1, Frag_A);
transaction.addToBackStack(null);
transaction.commit();

この場合、フラグメントを削除できます。

更新 2:

この行を取るようにしてください:メソッド スコープAddRemoveFragment Frag_A = new AddRemoveFragment();の外。setOnClickListenerあなたの問題は、ボタンをクリックするたびにこのフラグメントの新しいインスタンスを作成しているという事実だと思います。実際、ボタンをクリックするたびFragmentManager fm1 = getSupportFragmentManager();に a のインスタンスを取得する必要がないため、この行を外側に移動します。SupportFragmentManagerこれを一度行う必要があります。

于 2013-05-18T20:49:20.483 に答える