web-dev-qa-db-ja.com

FragmentManagerは、setOffscreenPageLimit()メソッドを使用した後、すでにトランザクションを実行しています

私はいくつかのフラグメントを持つナビゲーションドロワーを持っていますが、そのうちの1つは2つのrecyclerviewフラグメントを持つtablayoutです、ナビゲーションドロワーフラグメントを切り替えるとRecyclerViewアイテムが消えます質問のタイトルに記載されているバグを教えてくれます

ここに私のlogcatがあります

Java.lang.IllegalStateException: FragmentManager is already executing transactions
                                                                               at Android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.Java:1626)
                                                                               at Android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.Java:679)
                                                                               at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:143)
                                                                               at Android.support.v4.view.ViewPager.populate(ViewPager.Java:1240)
                                                                               at Android.support.v4.view.ViewPager.populate(ViewPager.Java:1088)
                                                                               at Android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.Java:852)
                                                                               at com.amir.ahmed.EELUStudentUnion.SelectionFragment.setupViewPager(SelectionFragment.Java:59)
                                                                               at com.amir.ahmed.EELUStudentUnion.SelectionFragment.onActivityCreated(SelectionFragment.Java:40)
                                                                               at Android.support.v4.app.Fragment.performActivityCreated(Fragment.Java:2089)
                                                                               at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1133)
                                                                               at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1290)
                                                                               at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:801)
                                                                               at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1677)
                                                                               at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:536)
                                                                               at Android.os.Handler.handleCallback(Handler.Java:739)
                                                                               at Android.os.Handler.dispatchMessage(Handler.Java:95)
                                                                               at Android.os.Looper.loop(Looper.Java:158)
                                                                               at Android.app.ActivityThread.main(ActivityThread.Java:7225)
                                                                               at Java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1230)
                                                                               at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)

それはタブレイアウトフラグメントコードです

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    viewPager.setOffscreenPageLimit(2);

    tabLayout = (TabLayout) getActivity().findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    setupTabIcons();
}



private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
    adapter.addFrag(new Courses(), "IT");
    adapter.addFrag(new CoursesBussiness(), "Business");
    viewPager.setAdapter(adapter);
}
11
Mero_vic280

あなたと同様の問題に遭遇しましたが、数時間の調査の後、この問題を発見しました。 ViewPagerがFragment内で作成される場合、getFragmentManager()ではなく、FragmentPagerAdapterに対してgetChildFragmentManager()を使用する必要があります。

したがって、setupViewPager()メソッドは次のようになります。

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
    adapter.addFrag(new Courses(), "IT");
    adapter.addFrag(new CoursesBussiness(), "Business");
    viewPager.setAdapter(adapter);
}

この問題の根本的な原因は、フラグメント内にフラグメントを埋め込んだことです。そのため、例外がスローされます。

Java.lang.IllegalStateException: FragmentManager is already executing transactions

Googleのドキュメントによると:

フラグメント内にフラグメントを埋め込むことができるようになりました。これは、動的で再利用可能なUIコンポーネントをそれ自体が動的で再利用可能なUIコンポーネントに配置するさまざまな状況で役立ちます。たとえば、ViewPagerを使用して左右にスワイプするフラグメントを作成し、画面スペースの大部分を消費する場合、各フラグメントページにフラグメントを挿入できるようになりました。フラグメントをネストするには、フラグメントを追加するフラグメントでgetChildFragmentManager()を呼び出すだけです。これは、フラグメントトランザクションを作成するためにトップレベルアクティビティから通常行うように使用できるFragmentManagerを返します。

32
Weidian Huang

これを試してみてください:

Handler handler = new Handler();
handler.post(new Runnable()
{
    @Override
 public void run()
{
 firstFragment(position);
}
});

詳細については、このリンクを確認してください:

stackoverflow

0
Gourav Samre