사용자 지정보기를 잘못 하위 클래스로 분류하면이 오류가 발생할 수 있습니다.
서브 클래스를 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
에서 초 국가로 작동하지 않을 것입니다은 클래스 로더를 필요로한다. 대신 당신은주의 깊게 BottomNavigationView
에서 SavedState
클래스를 검사하고 올바른 ClassLoaderCreator
오히려 Creator
보다 사용한다 : 그것은 당신이 클래스 로더를 통과 할 수 있기 때문에 BaseSavedState
또는 android.view.AbsSavedState
보다
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
을 연장 할 수있는 더 나은 선택을 슈퍼 클래스 :
SavedState(Parcel source, ClassLoader classLoader) {
super(source, classLoader); //available in android.support.v4.view.AbsSavedState
this.stateBundle = source.readBundle(classLoader);
}
다른 상황에서이 오류가 발생했습니다. Parcelable이 포함 된 번들에서 'bundle.keySet()'을 호출했습니다. 문제의 코드에 대해 개별 테스트 클래스를 실행하면 통과했지만 전체 테스트 스위트를 실행하면 'BadParcelableException'이 발생합니다. "수정"은'bundle.keySet()'전에'bundle.setClassloader (MyClass.class.getClassLoader())'를 수행하는 것이 었습니다. –