web-dev-qa-db-ja.com

add()とreplace()のフラグメントのライフサイクルとの違い

私のプログラムには、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();
}
20
thanhnh

FragmentTransactionを使用してフラグメントを非表示にすると、フラグメントはまだライフサイクルの実行状態である可能性がありますが、そのUIはウィンドウから切り離されているため、表示されません。したがって、技術的にはフラグメントと対話し、後で必要に応じてそのUIを再アタッチすることができます。フラグメントを置き換える場合は、実際にフラグメントをコンテナから引き出しており、ライフサイクルのすべてのティアダウンイベント(onPauseonStopなど)を通過します。そのフラグメントが再度必要になる理由は、それをコンテナーに挿入し直して、すべての初期化を再度実行する必要があるためです。

6
ennn791

置き換えると、ViewGroup _R.id.container_内のすべてのフラグメント(1,2,3,4,5)が新しいFragment(6)にスワップアウトされます。フラグメントが削除されると、それらは破棄されます。破棄されると、onDestroyView()メソッドが呼び出されます。

FragmentTransaction replace

2と4の質問についてはわかりません。 logcatに書き出すコードをもっと投稿できますか?

5
Ben Pearson