Вы можете получить эту ошибку, если вы неправильно выполнили подкласс пользовательского представления.
Предположим, вы являетесь подклассом BottomNavigationView
, и вы хотите добавить сохраненное состояние к сверхчеловеку в onSaveInstanceState()
.
Неправильная реализация Parcelable шаблонного (скопированный из другого класса или шаблона) будет выглядеть следующим образом:
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);
}
}
Это не будет работать, как сверхдержаву из BottomNavigationView
требует загрузчик классов. Вместо этого вы должны тщательно осмотреть SavedState
класс от BottomNavigationView
и использовать правильный ClassLoaderCreator
, а не 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);
}
}
Обратите внимание, что расширение android.support.v4.view.AbsSavedState
может быть лучшим выбором, чем BaseSavedState
или android.view.AbsSavedState
, так как это позволит вам пройти класс загрузчик суперкласс:
SavedState(Parcel source, ClassLoader classLoader) {
super(source, classLoader); //available in android.support.v4.view.AbsSavedState
this.stateBundle = source.readBundle(classLoader);
}
Я получил эту ошибку в другом контексте - вызывая 'bundle.keySet()' на комплекте, содержащем Parcelable. При запуске отдельного тестового класса против рассматриваемого кода он прошел, но запуск всего набора тестов привел к «BadParcelableException». «Исправить» было сделать 'bundle.setClassloader (MyClass.class.getClassLoader()) перед' bundle.keySet() '. –