我有一个包含 Fragment 容器 (FrameLayout) 的 Activity,我在 Activity.onCreate() 期间在其中放置了一个 Fragment。Fragment 包含一个 ViewPager,其中包含一堆 Fragment。所有这一切都很好。页面内容显示,我可以很好地浏览页面,甚至在贡献页面变得可见时看到操作栏中的操作机会。
现在我用另一个片段替换包含 ViewPager 的片段:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, new NewFragment(), tag);
transaction.addToBackStack(null);
transaction.commit();
更换工作正常。显示新的片段。当我点击将带有 ViewPager 的 Fragment 放回容器视图的后退按钮时,问题就出现了。使用常规 FragmentPagerAdapter 时,出现以下异常:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Recursive entry to executePendingTransactions
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1403)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:895)
at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:380)
at com.domain.app.MyFragment.onViewCreated(MyFragment.java:39)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:895)
at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:380)
at com.domain.app.MyFragment.onViewCreated(MyFragment.java:39)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:712)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1480)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:447)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at android.app.Activity.onKeyUp(Activity.java:2099)
可以看出 MyFragment.onViewCreated() 执行了两次,在第二次传递中抛出异常。我曾尝试单步执行 ViewPager 和 FragmentManager 代码,但这是一项艰巨的任务。
此外,我已经用 FragmentStatePagerAdapter 替换了 FragmentPagerAdapter,它实际上设法重新创建包含 ViewPager 但不是 ViewPager 本身的片段。尽管某些页面似乎在寻呼机上,但页面的内容是不可见的。关于 onPageSelected 回调,滑动是不可预测的,有时可以看到操作栏中的操作来自 ViewPager 中的片段。但所有这些都是零星的。
任何帮助将不胜感激。谢谢。