2014-02-11 3 views
15

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

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

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(); 
+0

Можете ли вы уточнить? Возможно, с некоторым кодом? onCreateView, конечно, будет вызван на предыдущий фрагмент, если у вас есть задняя сторона. –

+0

Не могли бы вы вставить свой лог-код на вопрос, пожалуйста, проще читать? –

ответ

4

на самом деле менеджер фрагмент не хранит ваши скрытые фрагмент хранит только st ели

класс 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 методу

+0

можете прояснить его, пожалуйста? –

+4

@veon, есть ли способ просто удалить фрагмент из стека без повторного воссоздания предыдущего? Что делать, если я хочу удалить сразу несколько фрагментов или просто хочу заменить стек новым фрагментом? –

-1

В моем случае у меня было 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() теперь не вызывается для верхнего фрагмента.

+6

onCreateView() все еще вызывается для меня, даже после того, как вы начали использовать popBackStackImmediate(). – Genc

0

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

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

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

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

Смежные вопросы