我有一个活动,其中包含一个片段容器(FrameLayout),其中我在Activity.onCreate()期间放置一个片段。碎片包含一个包含一堆碎片的ViewPager。所有这些工作正常。页面内容显示,我可以很好地滑过页面,甚至看到行动栏中的行动机会,因为贡献页面变得可见。替换包含ViewPager的片段
现在我替换包含ViewPager与另一片段的片段:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, new NewFragment(), tag);
transaction.addToBackStack(null);
transaction.commit();
更换工作正常。显示新的片段。问题出现时,我点击后面的按钮,放置碎片与ViewPager回到容器视图。当使用常规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中的片段。但所有这些都很零星。
任何帮助将不胜感激。谢谢。
“片段包含一个包含了一堆碎片的ViewPager” - 片段的片段里面不支持。 http://stackoverflow.com/questions/6847460/fragments-within-fragments/6847770#6847770 – CommonsWare
@CommonsWare我同意,但它在第一次创建时工作。 – Moritz
引用Hackborn女士的话:“试图在另一个片段的用户界面中放置一个片段将导致未定义的并可能被破坏的行为。”我建议你按照Hackborn女士的建议,或者让ViewPager使用一个非片段的PagerAdapter,或者不要将ViewPager放在一个片段中。 – CommonsWare