Подтвердить что ты не робот

Получение ссылки на дочерний фрагмент После воссоздания родительского фрагмента

Запуск Android 4.2, Android поддерживает вложенные фрагменты. Документ не дает много объяснений относительно вложенных Fragment жизненных циклов, но из опыта, кажется, их жизненный цикл действительно похож на "обычный" Fragments.

Похоже, есть одна большая разница: child Fragments не восстанавливается при вызове родительского метода Fragment onCreate. Как следствие, представляется невозможным сохранить/восстановить ссылку на конкретный Fragment:

  • Использование getChildFragmentManager.findFragmentByTag(String) всегда возвращает null в родительском Fragment onCreate(Bundle), потому что mActive - null.
  • Использование putFragment/getFragment приводит к NullPointerException, потому что getFragment ищет размер null mActive ArrayList.

Итак, мой вопрос довольно прост. Есть ли правильный способ получить ссылку на дочерний элемент Fragment в родительском методе Fragment onCreate?

4b9b3361

Ответ 1

Я не думаю, что вы можете в onCreate, поскольку представление не было построено в то время. Вы можете в onViewCreated(). Логика, которую я использовал, это:

  • Проверьте, сохранено ли состояние в onViewCreated(), если есть, попробуйте получить дочерний фрагмент
  • Затем проверьте, является ли дочерний фрагмент нулевым, если он есть, добавьте его с помощью диспетчера дочерних фрагментов.

Под "проверкой" я подразумеваю поиск фрагмента по id. Я думаю, по тегу тоже должен работать.

AFAIK вы не можете получить дочерний фрагмент до восстановления или создания иерархии представления, но вы можете сделать то же самое в более позднее время, например, в onActivityCreated()

Ответ 2

Как насчет setRetainInstanceState (true) на вашем фрагменте? Может ли это решить вашу проблему? Он решил некоторые проблемы, когда у меня есть ChildFragments во фрагменте. Мне нужно только сохранить ссылку на дочерний фрагмент фрагмента.

Но я всегда делал это в onCreateView(). Не уверен, будет ли он работать в onCreate()

Или вы имеете в виду нечто совершенно другое?

Ответ 3

используются u FragmentPagerAdapter? если не попробовать FragmentPagerAdapter вместо FragmentStatePagerAdapter Я понял, что есть ошибка при использовании FragmentStatePagerAdapter, когда у меня 4 уровня гнездо. Извините, мой английский плохой.

@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);
}