42 votes

Perte de données lors de la rotation de l'écran

J'ai un petit bug amusant dans mon application. Lorsque l'utilisateur fait pivoter l'écran, je perds une partie des données de mon activité. Quelqu'un qui a une idée de pourquoi cela se produit?

75voto

jaisonDavis Points 420
//Use onSaveInstanceState(Bundle) and onRestoreInstanceState

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

  // Save UI state changes to the savedInstanceState.   
  // This bundle will be passed to onCreate if the process is  
  // killed and restarted.

  savedInstanceState.putBoolean("MyBoolean", true);  
  savedInstanceState.putDouble("myDouble", 1.9);  
  savedInstanceState.putInt("MyInt", 1);  
  savedInstanceState.putString("MyString", "Welcome back to Android");  

  // etc.  

  super.onSaveInstanceState(savedInstanceState);  
}  

//onRestoreInstanceState  

@Override  
public void onRestoreInstanceState(Bundle savedInstanceState) {  

  super.onRestoreInstanceState(savedInstanceState);  

  // Restore UI state from the savedInstanceState.  
  // This bundle has also been passed to onCreate.  

  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");  
  double myDouble = savedInstanceState.getDouble("myDouble");  
  int myInt = savedInstanceState.getInt("MyInt");  
  String myString = savedInstanceState.getString("MyString");  
}

C'est ainsi que vous enregistrez vos données lorsque le système les supprime lors de la rotation.

42voto

Cheryl Simon Points 25259

Par défaut, lorsque l'écran est tourné, votre activité est tuée et redémarrée. Pour vous assurer qu'aucune donnée n'est perdue, vous devez enregistrer et restaurer correctement vos données à l'aide des méthodes de cycle de vie. Voir Enregistrement de l'état persistant .

8voto

Theodor Paulus Points 41

La solution la plus rapide que j'ai trouvée est la suivante : http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

8voto

Suragch Points 197

Voici une variante de la réponse utile de @jaisonDavis :

 int myInt;
String myString;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_verses);


    if (savedInstanceState == null) {

        Intent intent = getIntent();
        myInt = intent.getIntExtra("MyIntIntentKey", DEFAULT_INT);
        myString = intent.getStringExtra("MyStringIntentKey", DEFAULT_STRING);

    } else { // savedInstanceState has saved values

        myInt = savedInstanceState.getInt("MyIntKey");
        myString = savedInstanceState.getString("MyStringKey");
    }

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putInt("MyIntKey", myInt);
    savedInstanceState.putString("MyStringKey", myString);

    super.onSaveInstanceState(savedInstanceState);
}

Dans cet exemple, les variables sont initialisées à partir d'un Intent la première fois que l'activité est créée, mais après cela, elles sont initialisées à partir de savedInstanceState (comme lorsque l'orientation change).

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