2011-07-25 177 views
1

在我的應用程序中,我有一個Activity,它由一個疊加的側面板(導航菜單)和一個LinearLayout組成,這是我的主佈局。我在我的佈局上進行交易並更換裏面的碎片。我只允許用戶向前導航,所以我根本不使用後臺堆棧。相反,當用戶在菜單中向前導航時,我使用Hashmap(僞緩存)將片段實例保留在內存中。這種方法唯一的問題是,當我嘗試用緩存中的片段替換當前在主佈局中的片段時(我通過調試器運行並且它說FragmentTransaction.replace()方法檢查後臺(??))。我不太確定問題在哪。Android:片段和背堆棧

07-25 22:03:47.690: ERROR/AndroidRuntime(3141): FATAL EXCEPTION: main 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141): java.lang.IllegalStateException: Fragment already added: GuideFragment{409f2fd8 id=0x7f06008c} 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.replace(BackStackRecord.java:360) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.BackStackRecord.replace(BackStackRecord.java:352) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at StartActivity.changeContent(StartActivity.java:194) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at StartActivity$5.onClick(StartActivity.java:165) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.view.View.performClick(View.java:3117) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.view.View$PerformClick.run(View.java:11935) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Handler.handleCallback(Handler.java:587) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.os.Looper.loop(Looper.java:132) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at java.lang.reflect.Method.invoke(Method.java:491) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):  at dalvik.system.NativeStart.main(Native Method) 
+0

後從更新的logcat – antlersoft

+0

堆棧跟蹤。我想我的問題是,是否有可能將碎片保存在HashMap而不是Backstack中?根據文檔,如果碎片沒有被添加到Backstack中,它將被破壞。然而,當我將它添加到HashMap並稍後檢索它時,它不是null。另外,爲什麼LogCat告訴我,碎片已經被添加了,因爲它從來沒有放在Backstack上? –

+0

您是在模擬器上還是在物理設備上測試?我在我的應用程序中以類似的方式處理碎片,並且它在物理設備上運行良好,但在模擬器上出現同樣的錯誤。 – theisenp

回答

1

我一直有類似的問題。正如我在評論中提到的,我的應用在物理設備上運行良好,但在模擬器上崩潰。我不是很積極,爲什麼它會拋出這個Fragment already added錯誤,但我找到了一個解決方法。

在嘗試替換一個片段之前,我首先使用try-catch塊刪除它(這似乎違反直覺,但似乎適用於我)。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
try 
{ 
    fragmentTransaction.remove(guideFragment); 
} 
catch(IllegalStateException e) 
{ 
    e.printStackTrace(); 
} 
fragmentTransaction.replace(R.id.container, guideFragment, GUIDE_FRAGMENT_TAG); 
fragmentTransaction.commit(); 

看來,replace()方法有一些奇怪的行爲,並不總是像你期望的那樣工作。 Others也必須使用解決方法。

0

檢查在替換之前是否添加了碎片。

1

看來你的片段無法在視圖中替換。膨脹時,你可能會缺少LayoutInflater.inflate()的第三個參數。

檢查,應該像

 @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.session_frag, container, false); 
      return view; 
     }