我有一個活動,其中包含一個片段容器(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