Restoring a SavedState view throws a ClassNotFoundException when opening the parent SavedState view

I have 2 classes ParentClass and ChildClass :

ParentClass is a subclass of RelativeLayout that saves state using onSaveInstanceState () / onRestoreInstanceState () with the following code:

 @Override protected Parcelable onSaveInstanceState() { SavedState savedState = new SavedState(super.onSaveInstanceState()); savedState.someObj = someObj; savedState.someInt = someInt; savedState.someEnum = someEnum; return savedState; } @Override protected void onRestoreInstanceState(Parcelable in) { if (!(in instanceof SavedState)) { super.onRestoreInstanceState(in); return; } SavedState savedState = (SavedState) in; super.onRestoreInstanceState(savedState.getSuperState()); this.someObj = savedState.someObj; this.someInt = savedState.someInt; this.someEnum = savedState.someEnum; } 

And here is the SavedState code:

 public static class SavedState extends BaseSavedState { private SomeObj someObj; private int someInt; private SomeEnum someEnum; public SavedState(Parcelable superState) { super(superState); } public SavedState(Parcel source) { super(source); someInt = source.readInt(); someEnum = SomeEnum.values()[source.readInt()]; someObj = source.readParcelable(SomeObj.class.getClassLoader()); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(someInt); dest.writeInt(someEnum.ordinal()); dest.writeParcelable(someObj, flags); } public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } 

Nothing unusual, everything works as expected (saving / restoring state) when I use this view directly.

Then I have a ChildClass that extends the ParentClass It also saves its state using exactly the same code, except that I only save long and int fields.

When an application tries to restore the ChildClass view ChildClass by calling its SavedState constructor with Parcel from CREATOR , it will work with the following stack:

 Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.app.ParentClass$SavedState 1 android.os.Parcel.readParcelableCreator Parcel.java, line 2320 2 android.os.Parcel.readParcelable Parcel.java, line 2270 3 android.view.AbsSavedState.<init> AbsSavedState.java, line 57 4 android.view.View$BaseSavedState.<init> View.java, line 20128 5 com.company.app.ChildClass$SavedState.<init> ChildClass.java, line 151 6 com.company.app.ChildClass$SavedState$1.a ChildClass.java, line 166 7 com.company.app.ChildClass$SavedState$1.createFromParcel ChildClass.java, line 164 
+5
source share
1 answer

Add SavedState class to Parcelable

 public static class SavedState extends Parcelable { 
0
source

All Articles