私はフラグメントを研究していて、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つのタグの場所の違いを説明できますか?
これら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を渡します。少なくとも私はいつもそうしています。
この例では、IDとしてタグを追加する必要はありません。ただやる:
ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();
IDとしてのタグは、UIなしでフラグメントを追加する場合によく使用されます。
addToBackStack()
に渡されたパラメーターを使用して、単一のフラグメントだけでなく、BackStackEntryオブジェクト全体を取得できます。フラグメントタグを設定するには、add(int、Fragment、String)およびreplace(int、Fragment、String)の3パラメータバージョンの使用を検討してください。
フラグメントを追加する前に、次を使用して、このフラグメントがすでにバックスタックにあるかどうかを確認できます。
getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);
null
がまだ追加されていない場合は、Fragment
が返されます。
AddtoBackStack(null)にnullを渡すと、フラグメントスタックにフラグメントが追加されますが、再度追加する前にスタック内の特定のフラグメントを識別するためにさらに使用できるTAGは追加されません。
.addToBackStack(null);
ただし、TAGをaddToBackStackに渡すと、TAGによってフラグメントスタック内のフラグメントを識別するのに役立ちます。お気に入り
.addToBackStack(FragmentName.TAG);
これで、フラグメントをスタックに追加する前に確認できます。
getFragmentManager().findFragmentByTag(SettingsFragment.TAG);
フラグメントがまだ追加されていない場合、これはnullを返します。