2014-01-08 77 views
1

我的问题在于。 我有BasicPhotoTakingActivity延伸SherlockFragmentActivity其中有拍照像takePhoto()loadFromGallery()等所有方法。故障保存活动状态扩展了另一个活动

现在我有另一个活动,它扩展BasicPhotoTakingActivity。

由于某些原因,例如在旋转设备屏幕时,应用程序崩溃onSaveInstanceState。

这里是代码:

ActivityWhichExtendsBasicPhotoTakingActivity的onSaveInstanceState:

@Override 
protected void onSaveInstanceState(Bundle outState) { 

    outState.putInt("state", currentStage.ordinal()); 

    super.onSaveInstanceState(outState); 
} 

BasicPhotoTakingActivity的onSaveInstanceState:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("imageUri", mCurrentPhotoPath); 
    if (bitmap != null) { 
     Logger.d(TAG, "Bitmap != null. Saving: " + bitmap.toString()); 
     outState.putBoolean("bitmap", true); 
    } 
    super.onSaveInstanceState(outState); 
} 

崩溃日志:

java.lang.IllegalStateException: Failure saving state: active AddBoatAddressFragment$1{65781b60} has cleared index: -1 
     at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1660) 
     at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1627) 
     at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1603) 
     at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1671) 
     at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:532) 
     at com.actionbarsherlock.app.SherlockFragmentActivity.onSaveInstanceState(SherlockFragmentActivity.java:127) 
     at com.android.activities.BasicPhotoTakingActivity.onSaveInstanceState(BasicPhotoTakingActivity.java:86) 
     at com.android.activities.AddMyBoatActivity.onSaveInstanceState(AddMyBoatActivity.java:97) 
     at android.app.Activity.performSaveInstanceState(Activity.java:1152) 
     at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1223) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3693) 
     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4998) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 

回答

0

很难确切地说,不知道你的所有代码(即你的清单中你的Activity是如何声明的,哪些碎片是没有被附加和激活的,等等)。我最初的想法是,你(有意或无意)保留了AddBoatAddressFragment,但告诉FragmentManager保留它的实例,所以当Activity被设置为销毁时(即从旋转),Fragment仍然是活动的。我不能肯定地说,但这是从FragmentManager类,并解释在您的堆栈跟踪的第一行:

Parcelable saveAllState() { 
    // Make sure all pending operations have now been executed to get 
    // our state update-to-date. 
    execPendingActions(); 

    mStateSaved = true; 

    if (mActive == null || mActive.size() <= 0) { 
     return null; 
    } 

    // First collect all active fragments. 
    int N = mActive.size(); 
    FragmentState[] active = new FragmentState[N]; 
    boolean haveFragments = false; 
    for (int i=0; i<N; i++) { 
     Fragment f = mActive.get(i); 
     if (f != null) { 
      if (f.mIndex < 0) { 
       throwException(new IllegalStateException(
         "Failure saving state: active " + f 
         + " has cleared index: " + f.mIndex)); 
      } 

      haveFragments = true; 

      FragmentState fs = new FragmentState(f); 
      active[i] = fs; 

      if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) { 
       fs.mSavedFragmentState = saveFragmentBasicState(f); 

       if (f.mTarget != null) { 
        if (f.mTarget.mIndex < 0) { 
         throwException(new IllegalStateException(
           "Failure saving state: " + f 
           + " has target not in fragment manager: " + f.mTarget)); 
        } 
        if (fs.mSavedFragmentState == null) { 
         fs.mSavedFragmentState = new Bundle(); 
        } 
        putFragment(fs.mSavedFragmentState, 
          FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 
        if (f.mTargetRequestCode != 0) { 
         fs.mSavedFragmentState.putInt(
           FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 
           f.mTargetRequestCode); 
        } 
       } 

      } else { 
       fs.mSavedFragmentState = f.mSavedFragmentState; 
      } 

      if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 
        + fs.mSavedFragmentState); 
     } 
    } 
1

试试这个,

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    if (outState!= null && outState.size() > 0) { 

}