旋转设备时,我一直收到此错误:
E/AndroidRuntime(16250): java.lang.IllegalStateException: Fragment already added: ImageFragment{41b67de0 #2 id=0x7f0d0054 imageFragment}
E/AndroidRuntime(16250): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1133)
E/AndroidRuntime(16250): at android.app.BackStackRecord.run(BackStackRecord.java:618)
E/AndroidRuntime(16250): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
E/AndroidRuntime(16250): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
E/AndroidRuntime(16250): at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime(16250): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(16250): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(16250): at android.app.ActivityThread.main(ActivityThread.java:5001)
E/AndroidRuntime(16250): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16250): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(16250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime(16250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
E/AndroidRuntime(16250): at dalvik.system.NativeStart.main(Native Method)
以下是我正在使用的代码:
ImageFragment imageFragment =
(ImageFragment) fragmentManager.findFragmentByTag(ImageFragment.TAG);
if (imageFragment == null) {
imageFragment = ImageFragment.newInstance(contentImageView, null);
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.grid_container, imageFragment, ImageFragment.TAG);
transaction.addToBackStack(null);
transaction.commit();
我该怎么办?
答案 0 :(得分:0)
当方向发生变化时,Fragment
不会被销毁,它会从活动中分离出来。活动被销毁并重新创建。
重新创建活动时会发生什么?
如果您的活动实例被销毁并重新创建,则状态为 布局恢复到以前的状态,不需要代码 你。
在此阶段,在调用此onCreate
活动后,您的片段将重新附加到活动。 findFragmentByTag
现在返回一个现有的片段,因为您尝试将相同的片段添加到容器中,您将获得异常。
只有当片段根本不存在时才应该添加片段。理想情况下,您的代码应该是这样的:
ImageFragment imageFragment =
(ImageFragment) fragmentManager.findFragmentByTag(ImageFragment.TAG);
if (imageFragment == null) {
imageFragment = ImageFragment.newInstance(contentImageView, null);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.grid_container, imageFragment, ImageFragment.TAG);
transaction.addToBackStack(null);
transaction.commit();
}