Стартовые фрагменты в виде пейджера вызывают незаконное исключение государства? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть случай, когда я делю основной экран на две части.Верхний макет будет запускать видео (отдельный фрагмент).На приведенном ниже экране должно быть несколько экранов, управляемых видоискателем.Каждый слайд viewpager будет отдельным фрагментом.Ниже приведен мой код в основной деятельности

    SampleVideoFragment sampleVideoFragment = new SampleVideoFragment();
    SecondFragment secondFragment = new SecondFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.firstlayout, sampleVideoFragment, sampleVideoFragment.getTag()).commit();
    //fragmentManager.beginTransaction().replace(R.id.secondlayout, secondFragment, secondFragment.getTag()).commit();
    mViewPager = findViewById(R.id.viewpagerID);
    setupViewPager();
    setCurrentFragment(0);

private void setupViewPager() {
    mBottomFragmentPageAdaptar = new BottomFragmentPageAdaptar(getSupportFragmentManager());
    mBottomFragmentPageAdaptar.addFragment(new Fragment1(), "Fragment1");
    mBottomFragmentPageAdaptar.addFragment(new Fragment2(), "Fragment2");
    mBottomFragmentPageAdaptar.addFragment(new Fragment3(), "Fragment3");
    mViewPager.setAdapter(mBottomFragmentPageAdaptar);
}

public void setCurrentFragment(int position){
    mViewPager.setCurrentItem(position);
}

Я также новичок в разработке Android.Я подозреваю, что это связано с тем же фрагментом, который используется Manger, вызывает это.Любой ввод или направление определенно помогут.

Присоединение исключения

java.lang.IllegalStateException: FragmentManager is already executing transactions
    at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2179)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2211)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:649)
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:167)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1238)
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:663)
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:625)
    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:606)
    at com.chooly.tenplusfive.InStreamModeActivity.setCurrentFragment(InStreamModeActivity.java:61)
    at com.chooly.tenplusfive.GameChatFragment.onCreateView(GameChatFragment.java:34)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2215)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:649)
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:167)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1238)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1086)
    at android.support.v4.view.ViewPager$3.run(ViewPager.java:267)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:618)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Проблема была связана с моими фрагментами, которые я использовал во ViewPager.Я пытался установить текущую позицию фрагмента в каждом фрагменте, это код фрагмента mActivity.setCurrentFragment (POSITION);setCurrentFragment - это метод в моей основной деятельности.

Это была попытка изменить состояние FragmentStatemanger, вызвавшее недопустимое состояние Exception.

Я после копания понял, что мне просто нужно создать экземпляр фрагментов и отдохнутьвсе заботится ViewPager.

0 голосов
/ 19 октября 2018

FragmentStatePagerAdapter использует commitNowAllowingStateLoss() - вызовы commitNow() не могут произойти, если в другой FragmentTransaction одновременно выполняется операция commit().

Вы можете обновить вашу FragmentTransaction, чтобы использовать commitNow(), котораяубедитесь, что ваша операция завершена до того, как FragmentStatePagerAdapter заполнит ее фрагменты.

fragmentManager.beginTransaction()
  .replace(R.id.firstlayout, sampleVideoFragment, sampleVideoFragment.getTag())
  .commitNow();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...