2014-02-11 27 views
15

試圖找出爲什麼在我彈出碎片時調用onCreateView。爲什麼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

你能否將你的logcat粘貼到問題中而不是 - 請閱讀 –

回答

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

即使在開始使用popBackStackImmediate()之後,onCreateView()仍然被我調用。 – Genc

0

我有同樣的問題 - popBackStack()popBackStackImmediate()被稱爲onCreateView的片段,這導致了幾個問題,包括丟棄上下文。

我的情況的解決方案是將片段添加到堆棧中:

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

這解決了我的問題,因爲FragmentManager停止創建視圖。

相關問題