【发布时间】:2011-10-12 23:07:36
【问题描述】:
在我的应用程序中,我有一个 Activity,它由一个重叠的侧面板(导航菜单)和一个 LinearLayout 组成,这是我的主要布局。我在我的布局上进行交易并替换里面的片段。我只允许用户向前导航,所以我根本不使用 backstack。相反,当用户在菜单中向前导航时,我使用 Hashmap(伪缓存)将片段实例保留在内存中。这种方法的唯一问题是,当我尝试用缓存中的片段替换当前位于主布局中的片段时,我不断崩溃(我通过调试器运行它,它说 FragmentTransaction.replace() 方法检查后台堆栈(??))。我不太确定是什么问题。
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)
【问题讨论】:
-
从 logcat 发布堆栈跟踪
-
已更新。我想我的问题是,是否可以将 Fragments 保存在 HashMap 而不是 Backstack 中?根据文档,如果 Fragment 没有被添加到 Backstack,它就会被销毁。然而,当我将它添加到 HashMap 并稍后检索它时,它不为空。另外,为什么 LogCat 告诉我 Fragment 已经添加了,而它一开始就没有放在 Backstack 上?
-
您是在模拟器还是物理设备上进行测试?我在我的应用程序中以类似的方式处理片段,它在物理设备上运行良好,但在模拟器上因同样的错误而崩溃。
标签: android stack hashmap back fragment