2015-04-14 2 views
4

У меня 2 классов ParentClass и ChildClass:Восстановление зрения SavedState бросает ClassNotFoundException при демаршаллизации родительского вида SavedState

ParentClass является подклассом RelativeLayout, который сохраняет состояние с помощью onSaveInstanceState()/onRestoreInstanceState() с помощью следующего кода:

@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; 
} 

А вот SavedState код:

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]; 
     } 
    }; 
} 

Ничего особенного, все работает как ожидается (сохранение \ восстановление состояния), когда я использую этот вид напрямую.

Тогда у меня есть ChildClass, который расширяет ParentClass Он также сохраняет это состояние, используя точно такой же код, за исключением того, что я сохраняю только длинные и int поля.

Когда приложение пытается восстановить ChildClass состояния просмотра, вызвав его SavedState конструктора Parcel из CREATOR он падает со следующим стеком:

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 

ответ

0

Сделайте SavedState класса реализацией Parcelable

public static class SavedState extends Parcelable { 
+1

'SavedState' расширяет' BaseSavedState', который расширяет 'AbsSavedState', который реализует' Parce lable', поэтому я не думаю, что это поможет – nemezis

Смежные вопросы