244 votes

Comment faire pour empêcher la perte d’État à travers des changements d’orientation écran d’affichages personnalisés

J'ai mis en œuvre avec succès onRetainNonConfigurationInstance() de mon activité principale de sauvegarder et de restaurer certains composants critiques à travers l'orientation de l'écran change.

Mais il semble, mes vues personnalisées sont en train d'être re-créé à partir de zéro lorsque les changements d'orientation. Cela a un sens, bien que dans mon cas, c'est gênant parce que la vue personnalisée en question est un X/Y de la parcelle et les points tracés sont stockés dans la vue personnalisée.

Est-il un astucieux moyen de mettre en œuvre quelque chose de semblable à onRetainNonConfigurationInstance() pour un affichage personnalisé, ou dois-je juste besoin de mettre en œuvre des méthodes dans la vue personnalisée qui me permettent d'obtenir et de définir son "état"?

Merci!

454voto

Kobor42 Points 1824

Je pense qu’il s’agit d’une version beaucoup plus simple. est un type intégré qui met en œuvre

409voto

Qberticus Points 20157

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

18voto

Blundell Points 28342

Voici une autre variante qui utilise un mélange de ces deux méthodes. La vitesse et l’exactitude de parcelable alliant la simplicité d’un forfait :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X