ViewPager с вложенными фрагментами?

Моя проблема

Согласно документам Google:

Теперь вы можете вставлять фрагменты внутри фрагментов. Это полезно для множества ситуаций, в которых вы хотите поместить динамические и повторно используемые компоненты пользовательского интерфейса в компонент пользовательского интерфейса, который сам по себе является динамическим и может использоваться повторно. Например,если вы используете ViewPager для создания фрагментов, которые проведите пальцем влево и вправо и занять большую часть экрана, вы Теперь можно вставлять фрагменты в каждую страницу фрагмента. Чтобы вложить фрагмент, просто вызовите getChildFragmentManager () для фрагмента, в который вы хотите добавить фрагмент. Это возвращает FragmentManager, который вы можете использовать, как обычно, из действия верхнего уровня для создания транзакций фрагмента. Например, вот некоторый код, который добавляет фрагмент из существующего класса Fragment:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Итак, я создал свой собственныйPageFragment, И мойPageFragmentAdapterсостоят из 3 страницPageFragment, У меня также есть шесть фрагментов:Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC, В моемMainActivity Я инициализирую мои шесть фрагментов, мойViewPager и этоPageFragmentAdapter (которые инициализируют триPageFragment для себя).

Затем я использую этот метод, чтобы прикрепить мойFragment1, Fragment2, Fragment3 к каждой странице (к каждойPageFragment) изPageFragmentAdapter:

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

Я могу получить (через методы вPageFragmentAdapter) Фрагменты и сделать "вложенный фрагмент" в мойPageFragment (конечно вonCreate()) любить:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

Примечание: я используюPageFragment.setNestedFragment() устанавливатьmFragment в этом.

И это прекрасно работает! Это поможет мне (но эта история не об этом) просто заменить фрагменты во ViewPager, например:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Но у меня есть одна огромная проблема. Снова документы Google:

Реализация PagerAdapter, которая представляет каждую страницу как фрагмент, который постоянно хранится в диспетчере фрагментов, пока пользователь может вернуться на страницу. Эта версия пейджера лучше всего подходит для использования, когда есть несколько статических фрагментов, которые нужно пролистать, например, набор вкладок.Фрагмент каждой страницы пользователя посещения будут храниться в памяти, хотя их иерархия просмотра может быть уничтожен, когда не виден. Это может привести к использованию значительного объема памяти, поскольку экземпляры фрагмента могут удерживать произвольное количество состояния.

Как вы видетеPageFragmentAdapter может уничтожить каждый мойPageFragment и, конечно, его вложенный фрагмент. И когда он будет воссоздан, он будет иметь значение NULLmFragment стоимость. Я пытаюсь сохранить его черезgetChildFragmentManager().putFragment() а затем получить егоgetChildFragmentManager().getFragment(), Но это не сработало.

Вопрос

Итак, мой вопрос:Как сохранить мой вложенный фрагмент в родительском фрагменте? Является ли это возможным?

Буду очень признателен за вашу помощь. Алекс. Постскриптум Очень жаль мой английский :)

РЕДАКТИРОВАТЬ

Спасибо @ AndroidBegin.com за ответ!

Это, похоже, ошибка в недавно добавленной поддержке вложенных фрагментов. По сути, дочерний FragmentManager заканчивается нарушенным внутренним состоянием, когда он отсоединяется от действия. Краткосрочный обходной путь, который исправил это для меня, заключается в добавлении следующего к onDetach () каждого фрагмента, для которого вы вызываете getChildFragmentManager ():

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос