Ten błąd można uzyskać, jeśli niepoprawnie podklasuje się niestandardowy widok.
Załóż, że podklasy są BottomNavigationView
i chcesz dodać zapisany stan do superpaństwa w onSaveInstanceState()
.
Niewłaściwa realizacja Parcelable boilerplate (skopiowany z innej klasy lub szablonu) będzie wyglądać następująco:
static class State extends BaseSavedState {
Bundle stateBundle;
//incorrect as super state uses ClassLoaderCreator
public static final Creator<State> CREATOR = new Creator<State>() {
public State createFromParcel(Parcel in) {
return new State(in);
}
public State[] newArray(int size) {
return new State[size];
}
};
State(Parcel source) {
super(source);
this.stateBundle = source.readBundle(getClass().getClassLoader());
}
State(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBundle(stateBundle);
}
}
To nie będzie działać jako superpaństwa z BottomNavigationView
wymaga classloader. Zamiast tego należy starannie kontrolować klasę SavedState
z BottomNavigationView
i użyć poprawne ClassLoaderCreator
zamiast Creator
:
static class State extends AbsSavedState {
Bundle stateBundle;
public static final Creator<State> CREATOR = new ClassLoaderCreator<State>() {
public State createFromParcel(Parcel in, ClassLoader classLoader) {
return new State(in, classLoader);
}
@Override
public State createFromParcel(Parcel source) {
return new State(source, null);
}
public State[] newArray(int size) {
return new State[size];
}
};
State(Parcel source, ClassLoader classLoader) {
super(source, classLoader);
this.stateBundle = source.readBundle(classLoader);
}
State(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBundle(stateBundle);
}
}
Zauważ, że rozszerzenie android.support.v4.view.AbsSavedState
może być lepszym wyborem niż BaseSavedState
lub android.view.AbsSavedState
ponieważ pozwoli Ci zdać ładującego klasy do nadklasa:
SavedState(Parcel source, ClassLoader classLoader) {
super(source, classLoader); //available in android.support.v4.view.AbsSavedState
this.stateBundle = source.readBundle(classLoader);
}
Dostałem ten błąd w innym kontekście - wywołanie 'bundle.keySet()' w pakiecie zawierającym paczkę. Po uruchomieniu indywidualnej klasy testowej względem kodu, o którym mowa, minęło, ale uruchomienie całego zestawu testów spowodowało 'BadParcelableException'. "Naprawiono" było zrobienie 'bundle.setClassloader (MyClass.class.getClassLoader())' przed 'bundle.keySet()'. –