ViewPager: рекурсивная запись для executePendingTransactions - PullRequest
47 голосов
/ 07 сентября 2011

У меня есть ViewPager в ViewPager, и я получаю это исключение

09-07 18:30:26.392: ERROR/AndroidRuntime(841): FATAL EXCEPTION: main
    java.lang.IllegalStateException: Recursive entry to executePendingTransactions
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1331)
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:453)
    at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563)
    at android.view.View.dispatchAttachedToWindow(View.java:7974)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewGroup.addViewInner(ViewGroup.java:2968)
    at android.view.ViewGroup.addView(ViewGroup.java:2824)
    at android.support.v4.view.ViewPager.addView(ViewPager.java:537)
    at android.view.ViewGroup.addView(ViewGroup.java:2781)
    at android.view.ViewGroup.addView(ViewGroup.java:2761)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:848)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:616)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1359)
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:453)
    at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563)
    at android.view.View.dispatchAttachedToWindow(View.java:7974)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
    at android.view.ViewRoot.performTraversals(ViewRoot.java:726)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1944)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:126)
    at android.app.ActivityThread.main(ActivityThread.java:3997)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)

Я не совсем уверен, откуда возникла эта ошибка, и я не слишком много знаю о FragmentManager. Нужно ли сбрасывать транзакции или что-то в этом роде? Или ViewPager внутри ViewPager невозможно? И да, я знаю, что есть другие способы сделать это, но я хочу, чтобы привязанность и прокрутка были бесплатными. Также я хотел бы понять, как это на самом деле работает.

Ответы [ 3 ]

101 голосов
/ 24 декабря 2012

Новая версия Support Library v4 (или Android 4.2, конечно) решает эту проблему намного проще.Для этого просто создайте конструктор вашего пользовательского FragmentPagerAdapter следующим образом:

public CustomFragmentPagerAdapter(android.support.v4.app.Fragment fragment)
{
    super(fragment.getChildFragmentManager());

    // write your code here
}

Эта работа, потому что новая версия Android утверждается с использованием вложенных фрагментов

27 голосов
/ 20 сентября 2011

Недавно я столкнулся с той же проблемой, и после небольшого исследования я с удивлением обнаружил, что вы просто не можете встроить один фрагмент в другой.Здесь вы выполняете одну фрагментную транзакцию в другой.Это просто недопустимо.

Новая версия Support Library v4 (или Android 4.2, конечно) решает эту проблему.См. Ответ ниже.

Обновление getChildFragmentManager () добавлено для решения вышеуказанной проблемы.

7 голосов
/ 26 июня 2012

Обратитесь к этому. Отображение фрагмента просмотра внутри фрагмента

Это можно сделать, но это было сделано через Asysnc, так как вы должны позволить первой транзакции фрагментов завершиться первой.Вы можете иметь фрагменты внутри фрагментов.Я знаю, потому что у меня есть несколько проектов, делающих это.

...