"片段已添加"改变方向后

时间:2015-03-05 19:54:01

标签: android android-fragments

旋转设备时,我一直收到此错误:

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();

我该怎么办?

1 个答案:

答案 0 :(得分:0)

当方向发生变化时,Fragment不会被销毁,它会从活动中分离出来。活动被销毁并重新创建。

重新创建活动时会发生什么?

  

如果您的活动实例被销毁并重新创建,则状态为   布局恢复到以前的状态,不需要代码   你。

来源:Recreating an Activity

在此阶段,在调用此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();
  }