如果您不正确地子类化自定义视图,则可能会出现此错误。
假设您正在对BottomNavigationView
进行子类化,并且希望在onSaveInstanceState()
中向superstate添加已保存的状态。
Parcelable样板(从其他类或模板中复制)的不正确实现如下:
static class State extends BaseSavedState {
Bundle stateBundle;
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
。相反,您应该仔细检查BottomNavigationView
中的SavedState
类,并使用正确的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);
this.stateBundle = source.readBundle(classLoader);
}
bundle.keySet()
。当针对相关代码运行单独的测试类时,测试通过,但是运行整个测试套件会导致BadParcelableException
。"解决"方法是在bundle.keySet()
之前执行bundle.setClassloader(MyClass.class.getClassLoader())
。 - Stan Kurdziel