Reputation: 93
My problem is following. I have BasicPhotoTakingActivity extends SherlockFragmentActivity which have all methods for taking pictures like takePhoto() loadFromGallery(), etc.
Now I have another activity which extends BasicPhotoTakingActivity.
For some reason app is crashing onSaveInstanceState for example when rotating device screen.
Here are code:
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);
}
Crash log:
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)
Upvotes: 1
Views: 1571
Reputation: 11
Try this,
@Override
protected void onSaveInstanceState(Bundle outState) {
if (outState!= null && outState.size() > 0) {
}
Upvotes: 1
Reputation: 7091
It's tough to say for sure without knowing about all of your code (i.e. how your Activity is declared in your manifest, what fragments are and are not attached and active, etc). My initial thought is that you are (intentionally or accidentally) preserving the AddBoatAddressFragment but telling the FragmentManager to retain it's instance, so the Fragment is still active at the time the Activity is set to be destroyed (i.e. from rotation). I can't say for sure, but this is from the FragmentManager class and explains the first line in your stacktrace:
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);
}
}
Upvotes: 0