Vous faites cela par la mise en œuvre de View#onSaveInstanceState
et View#onRestoreInstanceState
et l'extension de l' View.BaseSavedState
classe.
public class CustomView extends View {
private int stateToSave;
...
@Override
public Parcelable onSaveInstanceState() {
//begin boilerplate code that allows parent classes to save state
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
//end
ss.stateToSave = this.stateToSave;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
//begin boilerplate code so parent classes can restore state
if(!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
//end
this.stateToSave = ss.stateToSave;
}
static class SavedState extends BaseSavedState {
int stateToSave;
SavedState(Parcelable superState) {
super(superState);
}
private SavedState(Parcel in) {
super(in);
this.stateToSave = in.readInt();
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(this.stateToSave);
}
//required field that makes Parcelables from a Parcel
public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}
Le travail est divisé entre la Vue et le point de Vue de l'SavedState classe. Vous devez faire tout le travail de la lecture et de l'écriture et de l' Parcel
dans la SavedState
classe. Ensuite, votre point de Vue de la classe peut faire le travail de l'extraction de l'etat membres et de faire le travail nécessaire pour obtenir le retour en classe à un état valide.
Notes: View#onSavedInstanceState
et View#onRestoreInstanceState
sont appelés automatiquement pour vous si View#getId
renvoie une valeur >= 0. Cela se produit lorsque vous lui donner un id en xml ou appelez - setId
manuellement. Sinon, vous vous appelez View#onSaveInstanceState
et écrire le Parcelable retourné le colis vous obtenez en Activity#onSaveInstanceState
d'enregistrer l'état et par la suite de le lire et de le transmettre View#onRestoreInstanceState
de Activity#onRestoreInstanceState
.
Un autre exemple simple de ce qui est le CompoundButton