2013-10-01 18 views
20

Android 4.2を起動すると、Androidはnested Fragmentsをサポートします。このドキュメントでは、ネストされたFragmentのライフサイクルに関する多くの説明はありませんが、経験から見ると、ライフサイクルは実際には「通常の」Fragmentsに似ています。子フラグメントへの参照を取得する親フラグメントを再作成した後のフラグメント

大きな違いがあるようですが、親FragmentonCreateメソッドが呼び出されたときに子のFragmentsは復元されません。その結果、特定のFragmentへの参照を保存/復元することは不可能と思われる:

  • mActivenullあるのでgetChildFragmentManager.findFragmentByTag(String)を使用すると、常に親FragmentonCreate(Bundle)nullを返します。 getFragmentがnull mActiveArrayListのサイズを探すためNullPointerExceptionputFragment/getFragment結果を使用して

私の質問はとても簡単です。子Fragmentへの参照を親のFragmentonCreateメソッドで取得する正しい方法はありますか?

+0

'getChildFragmentManager()。getFragments()'は子フラグメントを参照していますか? –

+1

私は、ネストされたフラグメントのサポートlibaryの実装でのみ働いていましたが、ネストされたフラグメントがそこに再現され、動的な状況では、通常は "タグ付きフラグメントが子フラグメントマネージャにあるかどうかをチェックします。サイクル。これは、私が子供の断片を「労働者」として使用したとき、私にとってはうまくいきました。 –

答えて

25

onCreateにはその時点でビューが構築されていないとは思いません。あなたはonViewCreated()にすることができます。私が使用されるロジックは次のとおりです。

  • チェックがあれば状態は、onViewCreated()であっ保存されている場合、使用してそれを追加し、それがある場合、子フラグメントは、nullであるかどうかを確認後、子フラグメント
  • を取得しよう子フラグメントマネージャ。

「チェックする」とは、idでフラグメントを調べることを意味します。私はタグでも動作するはずだと思います。

私の知る限り、あなたのsetRetainInstanceState(真)についてonActivityCreated()

+0

私はこの回答に同意します。ヘッドレスのフラグメントの場合、私は 'onActivityCreated'フックを使って子フラグメントにアクセスします。 – jayeffkay

1

何でビュー階層が復元または作成され前に、子フラグメントを取得することはできませんが、たとえば、後で同じことを行うことができます断片? 問題を解決できますか?断片にChildFragmentsがあるとき、それはいくつかの問題を解決しました。私はフラグメント内のchildfragmentへの参照を保持する必要があります。

しかし、私は常にonCreateView()でそれを行いました。 onCreate()で動作するかどうかわからない

まったく別の意味ですか?

0

FragmentPagerAdapterを使用していますか? FragmentStatePagerAdapterの代わりにFragmentPagerAdapterを試します 4段階のネストがあるときにFragmentStatePagerAdapterを使用するといくつかのバグがあることに気付きました。 申し訳ありません私の英語は貧しいです。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
    mFragment1 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment1); 
    mFragment2 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment2); 
    mFragment3 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment3); 
    } else { 
    mFragment1 = SomeFragment.newInstance("param1"); 
    mFragment2 = SomeFragment.newInstance("param2"); 
    mFragment3 = SomeFragment.newInstance("param3"); 
    } 
    super.onCreate(savedInstanceState); 
    mMyPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), mFragment1, mFragment2, mFragment3); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if (mFragment1 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment1, 
       mFragment1); 
    } 

    if (mFragment2 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment2, 
       mFragment2); 
    } 

    if (mFragment3 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment3, 
       mFragment3); 
    } 

    super.onSaveInstanceState(outState); 
}