35

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

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

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

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

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

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

4

3 に答える 3

24

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

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

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

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

attach()とはそれぞれ、との関連付けまたはからのdetach()切り離しです。をアタッチする場合はライフサイクルメソッドを呼び出し、デタッチする場合はライフサイクルメソッドを呼び出します。詳細については、上記のリンクを参照してください。FragmentActivityFragmentonAttach()onDetach()Fragment

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

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

于 2012-08-28T07:46:30.970 に答える
13

についてのメモpopBackStack()。フラグメントをポップするのではなく、フラグメントトランザクションをポップします。したがって、最後のフラグメントトランザクションが何であれ逆になります。を表示していFragmentAて、トランザクションが次の場合:

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

に置き換えFragmentAられFragmentB、そのトランザクション(フラグメントではない)がバックスタックに追加されます。次に戻るボタンを押すと、バックスタックがポップされ、「これFragmentAを「」に置き換えた」トランザクションが取得されFragmentBます。次に、そのトランザクションを取り消します。逆に、命令は、現在のフラグメントが何であれ、を置き換えることFragmentAです。オリジナルFragmentAがまだ存在する場合は、それを使用します。それが破壊された場合、それは新しいものを作ります。

于 2014-02-10T16:27:44.557 に答える
4

フラグメント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.
于 2016-02-28T10:56:44.370 に答える