1

在我的应用程序中,我有一个 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)
4

3 回答 3

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;
        }
于 2012-10-01T14:42:16.307 回答
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() 方法有一些奇怪的行为,并不总是像您期望的那样工作。 其他人也不得不使用变通方法。

于 2011-08-08T20:14:10.073 回答
0

在替换之前检查添加的片段是否有效。

于 2011-10-12T03:17:39.267 回答