"在onSaveInstanceState之后无法执行此操作" - 为什么我从我的activity的onResume方法中获取此异常?

Pac*_*Sky 30 android illegalstateexception android-fragments

我的活动使用ACTION_IMAGE_CAPTURE意图调用相机.如果相机活动成功返回,我在onActivityResult回调中设置了一个标志,并根据标志的值我在onResume中启动一个片段,为捕获的图像添加标题.这似乎工作正常.

我只是从"狂野"中得到一个堆栈跟踪抱怨我在调用onSaveInstanceState后尝试提交片段事务.但我正在使用onResume方法进行提交!为什么android会抱怨这个?我的AndroidManifest.xml中设置了android:configChanges ="orientation | keyboardHidden | keyboard | screenSize",因此方向更改不应触发此....

这发生在运行4.0.4的三星Galaxy S3(SGH-i747)上

这是堆栈:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
    at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.performFragmentTransition(AddPhotosActivity2.java:278)
    at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.switchToCaptionsFragment(AddPhotosActivity2.java:438)
    at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.onResume(AddPhotosActivity2.java:167)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158)
    at android.app.Activity.performResume(Activity.java:4544)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1187)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4514)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

任何帮助或智慧都表示赞赏.

Pac*_*Sky 56

我知道答案 - 我正在使用v4兼容库中的FragmentActivity,所以我需要在onResumeFragments而不是onResume中执行我的片段事务.有人可以证实吗?

  • 在我进行更改以使用onResumeFragments而不是onResume来执行我的片段事务之后,这些错误已经消失 - 另一个数据点.我没有实现空片段解决方法,并且不需要.我会注意到,我还会定期将我的应用更新到最新的v4兼容性库,因此谷歌可能会修复它们.我的活动不会在配置更改时重新启动 - 我在清单中重写此操作并自行处理配置更改. (2认同)
  • 谷歌应该更好地记录这种方式.我还在等待谷歌在其中一个指南中提到这一点! (2认同)
  • 我只是在显示插页式广告之后才解决这个问题...旋转之后我的dialogfragmets从onResume开始正确启动. (2认同)

Asa*_*sen 13

你可以使用这个方法 commitAllowingStateLoss()

但请注意,您可以丢失您的活动状态,因为您可以在google的android参考中看到, 它以下列方式解释了两者之间的差异

与commit()类似,但允许在保存活动状态后执行提交.这很危险,因为如果活动需要稍后从其状态恢复,则提交可能会丢失,因此这应该仅用于UI状态可以在用户上意外更改的情况.

根据我的经验,它可能导致addToBackStack方法有时无法工作,因此您需要在片段上手动添加它,当然状态不会被保存(文本框文本扩展名).