2011-09-07 6 views
47

에 재귀 항목 나는 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가 불가능합니까? 그리고 네, 나는 이것을 할 수있는 다른 방법이 있음을 압니다. 그러나 나는 자유를 위해 스냅과 스크롤을 원합니다. 또한 실제로 어떻게 작동하는지 이해하고 싶습니다.

답변

27

최근에 같은 문제가 발생했습니다. 약간의 조사가 끝나자 한 조각을 다른 조각에 간단하게 포함시킬 수 없다는 사실에 놀랐습니다. 여기에서는 하나의 프래그먼트 트랜잭션을 다른 트랜잭션에서 실행합니다. 그것은 허용되지 않습니다.

새 버전의 Support Library v4 (또는 Android 4.2 물론)가이 문제를 해결합니다. 아래 답변을 참조하십시오.

업데이트 getChildFragmentManager()이 위에 언급 된 문제를 해결하기 위해 추가되었습니다.

+27

이 더 이상 사실입니다을 사용하여 승인 만 있기 때문에, 최신 지원 라이브러리는 하위 FragmentManager에 추가하는 이것을 가능하게합니다. – Adam

+7

그들은 결국 이것을 관리했습니다! 축하합니다! 안드로이드 팀! –

+1

아직 수락 된 답변이므로 답변을 업데이트해야합니다. – desgraci

7

참조하십시오. Display fragment viewpager within a fragment

첫 번째 조각 트랜잭션을 먼저 완료해야하므로 Asysnc를 통해 수행 할 수 있습니다. 조각 내 조각을 가질 수 있습니다. 나는 그것을하고있는 몇 개의 프로젝트가 있기 때문에 나는 알고있다.

+0

이것은 처리기 또는 AsyncTask를 executePendingTransactions()로 사용하는 것처럼 보입니다. 부모 조각이 완료되면 executePendingTransactions()가 실행됩니다. executePendingTransactions() – siliconeagle

101

새 버전 Support Library v4 (또는 Android 4.2, ofcourse)은이 문제를 훨씬 간단하게 해결합니다. 이 작업을 수행, 간단하게 다음과 같이 사용자 정의 FragmentPagerAdapter의 생성자를 수행

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

    // write your code here 
} 

이 작품의 새로운 안드로이드 버전이 중첩 된 조각

+5

나머지는 유효 기간이 지난 응답이어야합니다. – howettl

+2

당신의 너무 대단한, 이것은 방금 몇 시간을 보냈던 문제를 해결했습니다. 매우 간단하고 4.2 환상적입니다. – Warpzit

+2

당신은 정답을 얻고 있어야합니다. 어쨌든, 나에게서 +1. 이것은 단지 내가 며칠 동안 가지고 있었던 문제를 고쳤다! –