web-dev-qa-db-fra.com

Enregistrement et restauration de l'état de la vue android

Je suis au courant de la sauvegarde et de la restauration de l'état d'activité. Mais ce que je veux faire, c'est sauvegarder et restaurer l'état d'une vue. J'ai une vue personnalisée et deux méthodes remplacées:

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) {
        Bundle bundle = (Bundle) state;
        currentLeftX = bundle.getInt(CURRENT_LEFT_X_PARAM, 0);
        currentTopY = bundle.getInt(CURRENT_TOP_Y_PARAM, 0);
    }
    super.onRestoreInstanceState(state);
}

@Override
protected Parcelable onSaveInstanceState() {
    super.onSaveInstanceState();
    Bundle bundle = new Bundle();
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX);
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY);
    return bundle;
}

Je m'attendais à ce que cela fonctionne sans problème, mais j'ai rencontré une erreur:

Causé par: Java.lang.IllegalArgumentException: classe d'état incorrecte, attend l'état d'affichage mais a reçu la classe Android.os.Bundle à la place. Cela se produit généralement lorsque deux vues de type différent ont le même identifiant dans la même hiérarchie. L'identifiant de cette vue est id/mapViewId. Assurez-vous que les autres vues n'utilisent pas le même identifiant. sur Android.view.View.onRestoreInstanceState (View.Java:6161)

Mais ce point de vue est le seul de mon activité. Je demande donc:

Quelle est la bonne façon de sauvegarder l'état de la vue?

30
Vladimir Ivanov

Vous supprimez le résultat de super.OnSaveInstanceState() et retournez le vôtre. Plus tard, dans OnRestoreInstanceState(Parcelable), vous retournez celui que vous avez créé.

La solution pour cela est ici:

Comment empêcher les vues personnalisées de perdre leur état lors des changements d'orientation d'écran # 2

3
Kobor42