Getting a reference to a child Fragment after the parent Fragment has been recreated

前端 未结 3 1267
有刺的猬
有刺的猬 2021-01-31 19:13

Starting Android 4.2, Android supports nested Fragments. The doc doesn\'t give a lot of explanations regarding nested Fragment lifecycles but from experience, it ap

相关标签:
3条回答
  • 2021-01-31 19:48

    I don't think you can in onCreate as the view isn't constructed at that time. You can in onViewCreated() though. The logic I used is:

    • Check if there is saved state in onViewCreated(), if there is, try to get the child fragment
    • Then check if the child fragment is null, if it is, add it using the child fragment manager.

    By "checking" I mean looking up the fragment by id. I guess by tag should work too.

    AFAIK you can't get a child fragment before the view hierarchy is restored or created, but you could do the same at later time, for example in onActivityCreated()

    0 讨论(0)
  • 2021-01-31 19:50

    What about setRetainInstanceState(true) on your fragment? Could it solve your problem? It solved some problems when I have ChildFragments in a Fragment. I only have to keep a reference to the childfragment in the fragment.

    But I allways did that in onCreateView(). Not sure if it will work in onCreate()

    Or do you mean something completely different?

    0 讨论(0)
  • 2021-01-31 19:50

    are u using FragmentPagerAdapter? if not try FragmentPagerAdapter instead of FragmentStatePagerAdapter I realised that have some bug when using FragmentStatePagerAdapter when i have 4 level nest. Sorry my english is poor.

    @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);
    }
    
    0 讨论(0)
提交回复
热议问题