Почему popbackstack вызывает onCreateView фрагмента?



Пытаюсь понять, почему onCreateView вызывается, когда я popbackstack фрагмент.



Используя следующий код:



fragmentManager.popBackStack("tag1", 1); 
ft = fragmentManager.beginTransaction();
ft.remove(fragmentManager.findFragmentByTag("tag1"));
ft.commit();


Logcat:



FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Invalid index 79, size is 79
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at edu.pacific.pocketrx.FlashCardFrag.onCreateView(FlashCardFrag.java:72)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1562)
at android.support.v4.app.FragmentManagerImpl$3.run(FragmentManager.java:495)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)


Код для удаления фрагмента:



fragmentManager.popBackStack("tag1", 1);
ft = fragmentManager.beginTransaction();
ft.remove(fragmentManager.findFragmentByTag("tag1"));
ft.commit();
489   3  

3 ответов:

На самом деле МЕНЕДЖЕР фрагментов не хранит ваш скрытый фрагмент, он хранит только состояние

Класс BackStackState реализует Parcelable

См.http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/support/v4/app/FragmentManager.java#FragmentManagerImpl.popBackStackState%28android.os.Handler%2Cjava.lang.String%2Cint%2Cint%29

И когда вы открываете фрагмент, диспетчер фрагментов пытается воссоздать предыдущее представление, чтобы отобразить ее.

См. метод moveToState

У меня была та же проблема - popBackStack() или popBackStackImmediate() вызывал onCreateView фрагмент, который вызывал несколько проблем, включая отброшенный контекст.

Для моего случая решением было добавить фрагмент в backstack:

if (fragment instanceof BackStackFragment) transaction.addToBackStack(null);

Это решило мою проблему, так как FragmentManager перестал создавать представление.

Update : Пожалуйста, игнорируйте этот ответ, это явно неправильно, и я понятия не имел, о чем говорю (это было 3 года назад!)

Оригинальный (неверный) Ответ:

В моем случае у меня было 2 фрагмента на задней стопке, называя это:

FragmentManager fm = activity.getSupportFragmentManager();
            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

, похоже, запускает onCreateView() даже для текущего фрагмента сверху, что довольно запутанно. Я заменил его на popBackStackImmediate:

FragmentManager fm = activity.getSupportFragmentManager();
        fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

И onCreateView() теперь не вызывается для верхнего фрагмента.

Comments

    Ничего не найдено.