Activity.onCreate() 中に Fragment を配置する Fragment コンテナー (FrameLayout) を含む Activity があります。Fragment には、多数の Fragment を含む ViewPager が含まれています。これはすべて正常に機能します。ページのコンテンツが表示され、ページをうまくスワイプできます。貢献しているページが表示されると、アクション バーにアクションが表示される可能性さえあります。
ここで、ViewPager を含む Fragment を別の Fragment に置き換えます。
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() は 2 回実行され、2 回目のパスで例外がスローされます。ViewPager と FragmentManager のコードをステップ実行しようとしましたが、それは難しい仕事です。
さらに、FragmentPagerAdapter を FragmentStatePagerAdapter に置き換えました。これは、実際には ViewPager を含むフラグメントを再作成しますが、ViewPager 自体は作成しません。一部のページは Pager にあるように見えますが、ページのコンテンツは表示されません。onPageSelected コールバックに関してスワイプは予測できず、ViewPager のフラグメントから提供されたアクション バーのアクションが表示されることがあります。しかし、それはすべてかなり散発的です。
どんな助けでも大歓迎です。ありがとう。