私のプログラムには、Fragment1、Fragment2、....-> Fragment6の6つのフラグメントがあります。
Add()ステートメントとreplace()ステートメントを使用して、フラグメントを切り替え、ライフサイクルを追跡します。
Fragment1 add Fragment2 add Fragment3 add Fragment4 add Fragment5 replace Fragment6
ライフサイクルを示すlog-cat(追跡のために、onCreate、onCreateView、onDestroyView、onDestroyにいくつかのprintfポイントがあります)
タグ______________テキスト
Fragment1 ________ _ onCreate
Fragment1 ________ _ onCreateView
Fragment1 ________ _ add Fragment2
Fragment2 ________ _ onCreate
Fragment2 ________ _ onCreateView
Fragment2 ________ _ add Fragment3
Fragment3 ________ _ onCreate
Fragment3 ________ _ onCreateView
Fragment3 ________ _ add Fragment4
Fragment4 ________ _ onCreate
Fragment4 ________ _ onCreateView
Fragment4 ________ _ add Fragment5
Fragment5 ________ _ onCreate
Fragment5 ________ _ onCreateView
Fragment5_______Fragment6を置き換える
フラグメント1_______onDestroyView
フラグメント_______onDestroyView
フラグメント5_______onDestroyView
Fragment6 ________ _ onCreate
Fragment6 ________ _ onCreateView
私の質問:
Why Fragment5がreplaced Fragment6に置き換えられた後、Fragment1&3&5はビューを破棄しますか?.
What Fragment2&4で起こっていますか?
理由 Fragment2&4は、Fragment1&3&5としてのビューを破棄しませんか?
Add()およびreplace()メソッドを呼び出すときのフラグメントのライフサイクルについて完全に理解できるように私を助けてください。
AddFragmentメソッドとreplaceFragmentメソッドを更新します。
public void addFragment(Fragment fromFragment, Fragment toFragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.container,toFragment, toFragment.getClass().getName());
transaction.hide(fromFragment);
transaction.addToBackStack(toFragment.getClass().getName());
transaction.commit();
}
public void replaceFragment(Fragment fromFragment, Fragment toFragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container,toFragment, toFragment.getClass().getName());
transaction.hide(fromFragment);
transaction.addToBackStack(toFragment.getClass().getName());
transaction.commit();
}
FragmentTransaction
を使用してフラグメントを非表示にすると、フラグメントはまだライフサイクルの実行状態である可能性がありますが、そのUIはウィンドウから切り離されているため、表示されません。したがって、技術的にはフラグメントと対話し、後で必要に応じてそのUIを再アタッチすることができます。フラグメントを置き換える場合は、実際にフラグメントをコンテナから引き出しており、ライフサイクルのすべてのティアダウンイベント(onPause
、onStop
など)を通過します。そのフラグメントが再度必要になる理由は、それをコンテナーに挿入し直して、すべての初期化を再度実行する必要があるためです。
置き換えると、ViewGroup
_R.id.container
_内のすべてのフラグメント(1,2,3,4,5)が新しいFragment
(6)にスワップアウトされます。フラグメントが削除されると、それらは破棄されます。破棄されると、onDestroyView()
メソッドが呼び出されます。
2と4の質問についてはわかりません。 logcatに書き出すコードをもっと投稿できますか?