1. ホーム
  2. android

[解決済み] FragmentManagerはすでにトランザクションを実行しています。コミット後にページャーを初期化するのはいつが安全ですか?

2023-02-17 12:53:08

質問

2つのフラグメントをホストするアクティビティがあります。アクティビティはオブジェクトをロードしている間、ローダーを表示することから始まります。ロードされたオブジェクトは、newInstanceメソッドを介して引数として両方のフラグメントに渡され、それらのフラグメントが添付されます。

final FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.container1, Fragment1.newInstance(loadedObject));
trans.replace(R.id.container2, Fragment2.newInstance(loadedObject));
trans.commit();

2番目のフラグメントは、android.support.v4.view.ViewPagerとタブを含んでいます。

viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(adapter.getCount()); //the count is always < 4
tabLayout.setupWithViewPager(viewPager);

問題は、android が次のように投げることです。

java.lang.IllegalStateException: FragmentManagerはすでに実行中です。 トランザクション

このスタックトレースで (私は android.support をパッケージ名から取り除きました)

v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1620) で v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637)にて。 at v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at v4.view.ViewPager.populate(ViewPager.java:1235)にて。 at v4.view.ViewPager.populate(ViewPager.java:1083)にて。 at v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:847)にて確認できます。

このデータでは、もし setOffscreenPageLimit(...); が削除されます。この問題を回避する他の方法はありますか?

ページャーをセットアップするのを待つことができるように、ライフサイクルの中でいつフラグメントトランザクションが完了するのでしょうか?

どのように解決するのですか?

sdk24以上をターゲットにしている場合は、使用できます。

FragmentTransaction.commitNow()

の代わりに commit()

古いバージョンを対象にしている場合は、電話をかけてみてください。

FragmentManager.executePendingTransactions()

の呼び出しの後に commit()