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+InvestmentsFragmentetc.проблема у меня была в том, что я не мог использовать
childFragmentManagerпо той причине, что щелчок по элементуAccount view(который находится внутри одного изFragmentСViewPager) нужно заменитьMainFragmentт. е. весь экран.используя
MainFragments hostFragmentт. е. передаетgetFragmentManager()включено замена, но при появлении заднего стека, я закончил с этим экраном:это было очевидно также, глядя на инспектора макет, где
ViewPagerпусто.видимо, глядя на восстановленный
Fragments Вы бы заметили, что ихViewвосстанавливается, но не соответствует иерархии выскочившего состояния. Для того чтобы сделать минимальный удар и не принудить а воссозданиеFragments я переписал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; } } ... }таким образом, я эффективно убеждаюсь, что восстановленный
Fragments повторно присоединены кViewPager.



Comments