110

アクティビティ:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();

transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();

FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();

ビューのコード:

<fragment
    android:id="@+id/Fragment1"
    android:name="com.landa.fragment.Fragment1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/include1" /> 

問題は、コンテンツが実際には置き換えられないことです。つまり、コンテンツが一番上に配置されます(つまり、重複します)。

クリックして戻ると、最初のフラグメントが正しく表示されます(2番目のフラグメントは表示されません)が、最初は両方が表示されます(最後のフラグメントのみが表示されるようにします)。

ここで何が欠けていますか?

4

16 に答える 16

148

あなたはここで2つの間違ったことをしています:

  1. xmlレイアウトファイルに静的に配置されているフラグメントを置き換えることはできません。レイアウトにコンテナ(例:)を作成してFrameLayoutから、を使用してプログラムでフラグメントを追加する必要がありますFragmentTransaction

  2. FragmentTransaction.replace最初のパラメーターとして、フラグメントのIDではなく、フラグメントを含むコンテナーのIDが必要です。したがって、最初の引数を、最初のフラグメントを追加したコンテナーのIDとして渡す必要があります。

詳細については、このリンクを参照してください。

于 2013-02-11T10:50:13.427 に答える
17

android開発者サイトでは、FrameLayout実行時にフラグメントを動的にロードするためにaを使用することを提案しています。xmlファイルにフラグメントをハードコーディングしました。したがって、このリンクに記載されているように、実行時に削除することはできません。

http://developer.android.com/training/basics/fragments/creating.html

このリンクは、プログラムを介してフラグメントを追加する方法を示しています。

http://developer.android.com/training/basics/fragments/fragment-ui.html

于 2013-02-11T10:50:55.827 に答える
7

私は同じ問題を抱えていて、すべての答えを見ましたが、どれも私の間違いを含んでいませんでした! 現在のフラグメントを置き換える前に、コンテナ アクティビティの xml にデフォルトのフラグメントを次のように表示していました。

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="....ShopFragment"
        android:id="@+id/fragment"
        tools:layout="@layout/fragment_shop" />
</FrameLayout>

その後、に渡しましFrameLayoutfragmentTransaction.replace()が、正確な問題がありました。前のフラグメントの上に 2 番目のフラグメントが表示されていました。

この問題は、xml からフラグメントを削除し、onCreate()次のようにプログラムの開始時に既定のプレビューのコンテナー アクティビティのメソッドでプログラムで表示することで修正されました。

    fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

およびコンテナー アクティビティ xml:

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
于 2016-08-22T14:23:03.810 に答える
5

フラグメントを置き換える前に、backStack をクリアできます。

    FragmentManager fm = getActivity().getSupportFragmentManager();

    for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
        fm.popBackStack();
    }

    // replace your fragments
于 2013-02-11T10:47:29.693 に答える