20

使用FragmentActivityすると、フラグメントの状態が自動的に復元され、すべてのフラグメントが再作成されます。

onSaveInstanceStateこれは主に状態を保存してからアクティビティの に復元することで行われることを私は知っていonCreateます。コードを少し見てみると、すべてのフラグメントが再作成され (または、retainInstance が true の場合にのみアタッチされ)、に追加されているFragmentManagerことがわかりましたが、どのようにビューに追加されるかは明確ではありません。復元されました。

私の最初の問題は、他の質問に似たいくつかのフラグメントの重複を取得することでした。私はそれを回避しましonCreateた:

   Fragment f = fm.findFragmentByTag(tagName);
   if(f==null) {
       f = createFragment();
       fm.beginTransaction().add(R.id.myContainer,f,tagName).commit();
   }  else {
     //Nothing it's on the view
   }

現在は機能していますが、どのように機能するのかまだ完全には理解できていません。

私の疑問は次のとおりです。

  • どの瞬間に、どのようにフラグメントがビューにアタッチされますか? フラグメントの復元がonCreateofで行われることを実験しましたFragmentActivity。しかし、setContentViewその後に呼び出すと、フラグメントはどのようにビューにアタッチされますか?
  • 上書きせずにフラグメントの再作成を防ぐことはできますonSaveInstanceStateか? フラグメントの数が異なる方向のレイアウトが異なるため、当初の意図は、保持されているとマークされた状態フラグメントを 1 つだけ再作成し、保持されているとマークされていない他のビュー フラグメントを復元しないことでした。
4

1 に答える 1

8

ビュー階層は自動的に復元されません。そのため、Fragment.onCreateView()またはActivity.onCreate()で、すべてのビューを復元する必要があります (xml から、またはプログラムによって)。フラグメントを含むそれぞれViewGroupに、最初に作成したときと同じ ID が必要です。ViewGroupビュー階層が作成されると、Android はすべてのフラグメントを復元し、ID のおかげでそれらのビューを適切に配置します。ViewGroupAndroidがフラグメントがあったの ID を覚えているとしましょう。onCreateView()これはとの間のどこかで発生しonStart()ます。

フラグメントの再作成を維持することは可能だと思いますが、フラグメントを保持する ViewGroup で可視性を GONE に設定します。この方法では、フラグメントは表示されず、後でプログラムで削除できます。

于 2013-05-18T20:54:19.933 に答える