【发布时间】:2015-06-03 18:04:37
【问题描述】:
尽管我努力防止多次添加片段,但我仍然遇到java.lang.IllegalStateException: Fragment already added: VideoFragment。
我有一个活动,其中 VideoFragment 仅在 onCreate 中实例化。在我尝试显示 VideoFragment 的唯一地方,我首先检查是否已经添加了该片段。
private VideoFragment videoFragment;
public void onCreate(Bundle savedInstanceState) {
...
videoFragment = new VideoFragment();
...
}
private void showVideoFragment() {
if (!videoFragment.isAdded()) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, videoFragment, "video").commit();
}
}
我无法始终如一地重现此问题以在调试器中检查,但我的运行时错误报告继续为用户报告异常 java.lang.IllegalStateException: Fragment already added: VideoFragment,堆栈跟踪由 Android 类组成。
/FragmentManager.java:1133→ android.app.FragmentManagerImpl.addFragment
/BackStackRecord.java:648→ android.app.BackStackRecord.run
/FragmentManager.java:1453→ android.app.FragmentManagerImpl.execPendingActions
/FragmentManager.java:443→ android.app.FragmentManagerImpl$1.run
/Handler.java:733→ android.os.Handler.handleCallback
/Handler.java:95→ android.os.Handler.dispatchMessage
/Looper.java:146→ android.os.Looper.loop
/ActivityThread.java:5487→ android.app.ActivityThread.main
/Method.java:-2→ java.lang.reflect.Method.invokeNative
/Method.java:515→ java.lang.reflect.Method.invoke
/ZygoteInit.java:1283→ com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
/ZygoteInit.java:1099→ com.android.internal.os.ZygoteInit.main
/NativeStart.java:-2→ dalvik.system.NativeStart.main
isAdded() 中添加的定义是否与用于检查分片事务的定义不匹配?
或者是否有某种方式活动中的 videoFragment 引用不一样?这是我在保存状态http://developer.android.com/guide/components/activities.html#SavingActivityState时需要明确处理的事情吗?
或者是否有可靠的替代方法来检查片段是否已被添加?
更新
我已经想出了如何半可靠地产生问题。
- 开始申请
- 离开应用程序,然后运行其他程序一段时间。在我的 Galaxy Nexus(这几天速度很慢)上,使用 Chrome 阅读几篇新闻文章似乎就足够了。返回主屏幕时,如果渲染需要几秒钟,则应用程序可能会抛出片段异常。
- 重新启动应用程序并触发片段更改
如果我杀死并简单地运行应用程序,一切似乎都很好。或者,如果我离开应用程序并立即返回,它可以正常工作。只有当应用程序在后台停留一段时间(足以从内存中删除?)时,才会出现片段问题。
我也试过 onCreate 没有效果
View v = findViewById(R.id.fragment_container);
if(v != null){
Log.d(TAG, "disabling save for fragment_container");
v.setSaveEnabled(false);
v.setSaveFromParentEnabled(false);
}
我还尝试在运行替换片段事务之前检查Fragment prior = getFragmentManager().findFragmentByTag("video"); 和Fragment prior2 = getFragmentManager().findFragmentById(R.id.fragment_container);,但这些出现null。
我的问题实际上看起来非常相似 https://code.google.com/p/android/issues/detail?id=61247 尽管时间似乎不如内存/缓存效果问题。我完全不清楚为什么这个问题被关闭了。
我将尝试生成一个简单的应用程序来复制这个问题。我目前使用的是 webrtc,而 logcat 输出完全是 webrtc 消息。
【问题讨论】:
-
您是否有可靠地重现此错误的特定配方?换句话说,用户采取了哪些步骤导致崩溃?
-
缺少你的 logcat 的其余部分
-
为什么要在 showVideoFragment() 上需要它时实例化片段 onCreate?一项检查可能是
if (videoFragment == null) { },然后实例化和事务。我的第二张支票是findFragmentByTag("video") == null -
我的应用也有类似的问题,堆栈跟踪只提供 Android API 调用,而没有引用我自己的代码。我花了一段时间才想出一个方法,用我从用户消息中得到的小提示来重现错误。就我而言,它发生在设备入睡并在我的应用程序在特定屏幕上运行时再次唤醒时。也许您的崩溃有类似的原因?
标签: java android android-fragments