19

私は Fragments を勉強していて、微分FragmentTransaction.replace(id, fragment, tag)FragmentTransaction.addToBackStack(tag)呼び出しについて少し混乱しました。現在のフラグメントがFragmentAで、 FragmentBをロードしたとしましょう。将来、 FragmentAをロードする必要があるときに、再ロードする必要はありません。古いものを古い状態でロードするだけです。次のコード セグメントを使用しました。

public void loadFragment(Fragment fragmentB, String tag) {
    FragmentManager fm = getSupportFragmentManager();
    View fragmentContainer = findViewById(R.id.fragment_container);

    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(fragmentContainer.getId(), fragmentB, tag);

    ft.addToBackStack(tag);

    ft.commit();
}

今、私は混乱しています。文字列タグをどこに追加すればよいですか? replace()コール内またはコール内または両方でaddToBackStack()? この 2 つのタグの場所の違いを説明できますか?

4

4 に答える 4

7

この 2 つのタグの場所の違いを説明できますか?

のドキュメントaddToBackStackは非常に明確です:

このバック スタック状態のオプションの名前、または null。

replace:

後で FragmentManager.findFragmentByTag(String) を使用してフラグメントを取得するための、フラグメントのオプションのタグ名。

したがって、これら 2 つのパラメーターは独立しており、1 つはバック スタックを識別し、もう 1 つは 内のフラグメントを識別しますActivity's FragmentManager

あなたのコードは、この観点からは正しいように見えますが、fragmentContainerビューを ID で検索せず、その ID を使用してフラグメントを置き換えるだけです。もっと簡単に:

public void loadFragment(Fragment fragmentB, String tag) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_container, fragmentB, tag);

    ft.addToBackStack(null);

    ft.commit();
}

後でこのバック スタックを識別する必要がない場合は、 に null を渡しますaddToBackStack。少なくとも私はいつもそうしています。

于 2013-09-17T09:39:34.740 に答える
6

この例では、IDとしてタグを追加する必要はありません。ただ行う:

ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();

識別としてのタグは、UIなしでフラグメントを追加する場合に一般的に使用されます。

于 2013-01-22T14:10:53.087 に答える