ViewPager:递归进入executePendingTransactions

问题描述:

我有一个ViewPager内的ViewPager和我得到这个例外ViewPager:递归进入executePendingTransactions

09-07 18:30:26.392: ERROR/AndroidRuntime(841): FATAL EXCEPTION: main 
    java.lang.IllegalStateException: Recursive entry to executePendingTransactions 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1331) 
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:453) 
    at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563) 
    at android.view.View.dispatchAttachedToWindow(View.java:7974) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewGroup.addViewInner(ViewGroup.java:2968) 
    at android.view.ViewGroup.addView(ViewGroup.java:2824) 
    at android.support.v4.view.ViewPager.addView(ViewPager.java:537) 
    at android.view.ViewGroup.addView(ViewGroup.java:2781) 
    at android.view.ViewGroup.addView(ViewGroup.java:2761) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:848) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:616) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1359) 
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:453) 
    at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563) 
    at android.view.View.dispatchAttachedToWindow(View.java:7974) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:726) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1944) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:126) 
    at android.app.ActivityThread.main(ActivityThread.java:3997) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 

我真的不知道哪里这个错误来自我不知道太多关于FragmentManager 。我是否需要刷新交易或类似的东西?或者ViewPager中的viewPager不可能?是的,我知道还有其他方法可以做到这一点,但我想要免费的抓取和滚动。另外我想了解它是如何工作的。

最近我遇到了同样的问题,经过一番调查后,我惊讶地发现你根本无法将一个片段嵌入到另一个片段中。在这里你正在另一个执行一个片段事务。这是不允许的。

新版本的Support Library v4(当然是Android 4.2)解决了这个问题。请参阅下面的答案。

更新 getChildFragmentManager()增加了解决上述问题。

+27

这不再是真实的,最新的支持库在儿童FragmentManager补充说,启用此功能。 – Adam

+7

他们终于搞定了!祝贺android团队! –

+1

你应该更新你的答案,因为它仍然是可以接受的答案。 – desgraci

参照这个。 Display fragment viewpager within a fragment

它可以完成,但必须通过Asysnc完成,因为您必须首先完成第一个片段事务。片段中可以有片段。我知道,因为我有几个项目在做。

+0

这似乎工作正常使用一个处理程序或AsyncTask executePendingTransactions()这将执行它在父代片段完成后它是executePendingTransactions() – siliconeagle

新版本的Support Library v4(或Android 4.2,课程)很简单地解决了这个问题。为了做到这一点,只需做你的自定义FragmentPagerAdapter的构造是这样的:

public CustomFragmentPagerAdapter(android.support.v4.app.Fragment fragment) 
{ 
    super(fragment.getChildFragmentManager()); 

    // write your code here 
} 

这工作,因为新的Android版本批准使用嵌套的片段

+5

这应该是接受的答案,其余的是过时的。 – howettl

+2

你真棒,这只是解决了我花了几个小时的问题。如此简单而且非常棒。 – Warpzit

+2

你应该得到正确的答案。无论如何,从我+1。这只是解决了我一直有的问题! –