53 votes

Gérer la rotation de l'écran sans perdre de données - Android

Je deviens fou de savoir quelle est la meilleure façon de gérer la rotation de l'écran. J'ai lu des centaines de questions/réponses ici mais je suis vraiment confus.

Comment puis-je enregistrer les données myClass avant que l'activité ne soit recréée afin que je puisse tout conserver pour redessiner l'activité sans une autre initialisation inutile ?

Existe-t-il un moyen plus propre et meilleur que le parcellaire ?

Je dois gérer la rotation car je veux changer la mise en page en mode Paysage.

 public class MtgoLifecounterActivity extends Activity {

    MyClass myClass;

    // Called when the activity is first created
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        If ( ?? first run...myClass == null ? ) {
            myClass = new MyClass();
        } else {
            // do other stuff but I need myClass istance with all values.
        }
        // I want that this is called only first time. 
        // then in case of rotation of screen, i want to restore the other instance of myClass which
        // is full of data.
    }

52voto

Prashant Points 49

Dans Activity Tag of Manifest, vous devriez avoir à mentionner

 <activity
        android:name="com.example.ListActivity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation">

Si vous utilisez Android 2.3 (niveau API 13) et supérieur, utilisez

 <activity
        android:name="com.example.Activity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation|screenSize">

Cela devrait fonctionner.

Cela ne fonctionnera qu'avec la balise d'activité et non avec la balise d' application

29voto

hotveryspicy Points 21181

peut utiliser la méthode de substitution onSaveInstanceState() et onRestoreInstanceState() . ou pour arrêter d'appeler onCreate() lors de la rotation de l'écran, ajoutez simplement cette ligne dans votre manifeste xml android:configChanges="keyboardHidden|orientation"

Remarque : votre classe personnalisée doit implémenter l'exemple Parcelable ci-dessous.

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("obj", myClass);
    }

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onRestoreInstanceState(savedInstanceState);
 myClass=savedInstanceState.getParcelable("obj"));
}

public class MyParcelable implements Parcelable {
     private int mData;

 public int describeContents() {
     return 0;
 }

 /** save object in parcel */
 public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }

 public static final Parcelable.Creator<MyParcelable> CREATOR
         = new Parcelable.Creator<MyParcelable>() {
     public MyParcelable createFromParcel(Parcel in) {
         return new MyParcelable(in);
     }

     public MyParcelable[] newArray(int size) {
         return new MyParcelable[size];
     }
 };

 /** recreate object from parcel */
 private MyParcelable(Parcel in) {
     mData = in.readInt();
 }


}

4voto

Bobbake4 Points 6297

Si vous n'avez pas besoin de redémarrer votre activité, définissez simplement l'attribut configChanges de votre activité dans AndroidManifest.xml sur ceci :

     android:configChanges="keyboard|keyboardHidden|orientation"

Cela indiquera à l'OS que vous allez vous charger de gérer une rotation et ne redémarrera pas votre activité. L'utilisation de cette méthode vous évitera d'avoir à enregistrer tout type d'état.

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