web-dev-qa-db-ja.com

Android FragmentTransaction.addToBackStack混乱

私はフラグメントを研究していて、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つのタグの場所の違いを説明できますか?

17
Khawar Raza

これら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();
}

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

6
gunar

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

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

IDとしてのタグは、UIなしでフラグメントを追加する場合によく使用されます。

5
K Roobroeck

addToBackStack()に渡されたパラメーターを使用して、単一のフラグメントだけでなく、BackStackEntryオブジェクト全体を取得できます。フラグメントタグを設定するには、add(int、Fragment、String)およびreplace(int、Fragment、String)の3パラメータバージョンの使用を検討してください。

フラグメントを追加する前に、次を使用して、このフラグメントがすでにバックスタックにあるかどうかを確認できます。

 getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);

nullがまだ追加されていない場合は、Fragmentが返されます。

1
Jawad Zeb

AddtoBackStack(null)にnullを渡すと、フラグメントスタックにフラグメントが追加されますが、再度追加する前にスタック内の特定のフラグメントを識別するためにさらに使用できるTAGは追加されません。

    .addToBackStack(null);

ただし、TAGをaddToBackStackに渡すと、TAGによってフラグメントスタック内のフラグメントを識別するのに役立ちます。お気に入り

.addToBackStack(FragmentName.TAG);

これで、フラグメントをスタックに追加する前に確認できます。

 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);

フラグメントがまだ追加されていない場合、これはnullを返します。

1
Narender Gusain