web-dev-qa-db-ja.com

フラグメントメソッド:attach()、detach()、remove()、replace()、popBackStack()

これらの機能とその目的が非常に混同されています。 replace()を使用すると、既存のフラグメントが新しいフラグメントに置き換えられることがわかりました。 addToBackStack(null)を使用してそのフラグメントをバックスタックに配置して、前に示したフラグメントに戻ることができます。フラグメントが追加(または置換)されたとき-onAttach()-> onCreate()など...フラグメントのメソッドは順番に呼び出されます。

アクティビティのフラグメントでremove()を呼び出すと、フラグメントのどの関数がどの順序で呼び出されますか?

attach()およびdetach()は何をしますか? detach()はフラグメントを削除しますか?そして、これらの2つのattach()detach()が使用されると、フラグメントのどの関数が呼び出され、どの順序で?

また、popBackStack()で何が起こりますか?アクティビティのフラグメントでpopBackStack()を使用すると、どの関数が呼び出されるのですか??

そして、onDestroy()はいつ呼び出されますか??

ありがとうございました。

33
Vikram Gupta

アクティビティからフラグメントに対してremove()を呼び出すと、フラグメントのどの関数がどの順序で呼び出されますか?

http://developer.Android.com/reference/Android/app/Fragment.html を見てください。

順序は次のとおりです。onPause()onStop()onDestroyView()onDestroy()onDetach()

Attach()およびdetach()は何をしますか? detach()はフラグメントを削除しますか?そして、これらの2つのattach()とdetach()が使用されると、フラグメントのどの関数が呼び出され、どの順序で??

attach()およびdetach()は、それぞれFragmentActivityに関連付けまたはデタッチします。 FragmentをアタッチするとonAttach()ライフサイクルメソッドが呼び出され、デタッチするとonDetach()ライフサイクルメソッドがFragmentで呼び出されます。詳細については、上記のリンクをご覧ください。

また、popBackStack()はどうなりますか??つまり、アクティビティのフラグメントでpopBackStack()を使用すると、どの関数が呼び出されますか?

Fragmentが破壊されていない場合、popBackStack()onStart()およびonResume()メソッドが呼び出されます。 Fragmentが以前に破棄されている場合、ライフサイクルメソッドはonAttach()から呼び出されます。 Activitiesの戻るボタンを押したときと同じです。

24
Adam L. Mónos

popBackStack()に注意してください。フラグメントをポップするのではなく、フラグメントトランザクションをポップします。したがって、最後のフラグメントトランザクションが反転されます。 FragmentAを表示していて、トランザクションが次の場合:

fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);

FragmentAFragmentBに置き換え、そのトランザクション(フラグメントではなく)をバックスタックに追加します。次に、戻るボタンを押すと、バックスタックがポップされ、トランザクションが取得されます。これは、「このFragmentAFragmentBに置き換え」でした。次に、そのトランザクションを逆にします。後方では、現在のフラグメントがFragmentAに置き換えられます。元のFragmentAがまだ存在する場合、それを使用します。破壊された場合、新しいものを作成します。

12
emote_control

次の手順で、フラグメントAとフラグメントBがコンテナに追加されたとします。

1. Added fragment A =>  .replace(R.id.container, fragmentA) => addToBackStack(null)
2. Added fragment B =>  .replace(R.id.container, fragmentB) => addToBackStack(null)
3. Removed fragment B => fragmentManager.popBackStack();

Fm.popBackStack()が呼び出されたときのコールバック:

FragmentB: onPause()
FragmentB: onStop()
FragmentB: onDestroy()
FragmentB: onDetach()
FragmentA: onCreateView()
FragmentA: onViewCreated()
FragmentA: onActivityCreated()
FragmentA: onStart()
FragmentA: onResume()

説明:popBackStack()を使用してフラグメントBを削除および破棄しているときに、フラグメントAビューが再び作成されて再開されたのはなぜですか?

回答:フラグメントBを追加したときに、replace()とaddToBackStack()を使用したため、すべてのフラグメントがコンテナから削除され、フラグメントBがコンテナに追加されました。また、このトランザクションはバックスタックに記録されました。したがって、fm.popBackStack()が呼び出されると、最初にトランザクションがバックスタックからポップアウトされるため、操作自体が元に戻ります。したがって、フラグメントbはコンテナから削除され、破棄されます。そして、他のすべてのフラグメントが追加されます。この場合、フラグメントAのビューがコンテナに追加されます。また、フラグメントAのonAttach&onCreate()は、すでに作成されてMainActivityにアタッチされているため、呼び出されないことにも注意してください。

フラグメントBのバックプレスは同じことを行います。

If you press the back button, it calls fm.popBackStack() and pops the transaction.
4
Richa