Фрагмент в ViewPager не восстановлен после popBackStack



587   3  

3 ответов:

после длительного расследования оказывается проблема с менеджером фрагментов.

при использовании конструкции, подобной приведенной выше, транзакция фрагмента для повторного присоединения фрагмента к списку страниц автоматически отбрасывается. Это в основном та же проблема, которая вызывает

java.lang.IllegalStateException: Recursive entry to executePendingTransactions 

при попытке изменить фрагменты внутри FragmentPager.

то же решение, что и для проблем с этой ошибкой, также применимо здесь. При построении FragmentStatePagerAdapter предоставляет правильный менеджер дочерних фрагментов.

вместо

    viewPager.setAdapter(new SimpleFragmentStatePagerAdapter(getFragmentManager(),mParentString));

do

    viewPager.setAdapter(new SimpleFragmentStatePagerAdapter(getChildFragmentManager(),mParentString));

Читайте также: github

что Павел не упомянул, если вы используете getChildFragmentManager, то вы будете страдать "пустой экран на спине нажата" вопрос.

иерархия в моем случае было:

MainActivity ->MainFragment ->TabLayout+ViewPager ->AccountsFragment+SavingsFragment+InvestmentsFragment etc.

проблема у меня была в том, что я не мог использовать childFragmentManagerпо той причине, что щелчок по элементу Account view (который находится внутри одного из FragmentС ViewPager) нужно заменить MainFragment т. е. весь экран.

enter image description here

используя MainFragments host Fragment т. е. передает getFragmentManager() включено замена, но при появлении заднего стека, я закончил с этим экраном:

enter image description here

это было очевидно также, глядя на инспектора макет, где ViewPager пусто.

enter image description here

видимо, глядя на восстановленный Fragments Вы бы заметили, что их View восстанавливается, но не соответствует иерархии выскочившего состояния. Для того чтобы сделать минимальный удар и не принудить а воссоздание Fragment s я переписал FragmentStatePagerAdapter следующие изменения:

я скопировал весь код FragmentStatePagerAdapter и изменен

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    // If we already have this item instantiated, there is nothing
    // to do.  This can happen when we are restoring the entire pager
    // from its saved state, where the fragment manager has already
    // taken care of restoring the fragments we previously had instantiated.
    if (mFragments.size() > position) {
        Fragment f = mFragments.get(position);
        if (f != null) {
            return f;
        }
    }
...
}

С

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    // If we already have this item instantiated, there is nothing
    // to do.  This can happen when we are restoring the entire pager
    // from its saved state, where the fragment manager has already
    // taken care of restoring the fragments we previously had instantiated.
    if (mFragments.size() > position) {
        Fragment f = mFragments.get(position);
        if (f != null) {
            if (mCurTransaction == null) {
                mCurTransaction = mFragmentManager.beginTransaction();
            }

            mCurTransaction.detach(f);
            mCurTransaction.attach(f);

            return f;
        }
    }
...
}

таким образом, я эффективно убеждаюсь, что восстановленный Fragment s повторно присоединены к ViewPager.

Comments

    Ничего не найдено.