यदि आप एक कस्टम व्यू को गलत तरीके से देखते हैं तो आप यह त्रुटि प्राप्त कर सकते हैं।
मान लें कि आप 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
से superstate के रूप में काम नहीं होता एक classloader की आवश्यकता है। इसके बजाय आप ध्यान से 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);
}
स्रोत
2018-01-23 23:19:43
मुझे यह त्रुटि एक अलग संदर्भ में मिली - एक बंडल पर 'bundle.keySet()' को कॉल करना जिसमें पार्ससेल योग्य था। प्रश्न में कोड के खिलाफ एक व्यक्तिगत टेस्ट क्लास चलाते समय, यह पारित हो गया, लेकिन पूरे टेस्ट सूट को चलाने से 'BadParcelableException' में परिणाम हुआ। "फिक्स" 'bundle.setClassloader (MyClass.class.getClassLoader()) 'bundle.keySet()' से पहले था। –