2010-07-03 5 views

Répondre

51

Les objets personnalisés peuvent être enregistrés dans un ensemble lorsqu'ils implémentent l'interface Parcelable. Ensuite, ils peuvent être sauvés via:

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

Fondamentalement, les méthodes suivantes doivent être mises en œuvre dans le fichier de classe:

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(); 
    } 
} 
+3

Je trouve qu'il y a moins de travail à traduire dans et à partir de JSON, par rapport à – Arcantos

+0

onSaveInstanceState devrait être à la fin de la fonction! https://developer.android.com/training/basics/activity-lifecycle/recreating.html –

+0

Bien que ce soit la bonne façon d'enregistrer l'objet personnalisé dans onSaveInstanceState(), vous devez vous assurer que vous n'enregistrez pas de gros objets en utilisant cette méthode . C'est juste pour sauvegarder l'état de l'écran. Si les objets deviennent volumineux, il y a une chance que vous obteniez l'exception 'TransactionTooLargeException' – abat

1

Vérifiez this réponse.

Fondamentalement, vous devez l'enregistrer dans un Bundle.

+0

Ok merci, peut-être que je n'étais pas assez clair. Ce que je voulais savoir, c'est comment sauvegarder un objet * custom *. J'ai trouvé que je peux le rendre parcelable. – jul

3

Je sais « que cette affaire est froid », mais parce que je trouvé ce fil d'abord, quand je cherchais exactement la même chose (et trouvé une réponse maintenant):

Imaginez Bundle comme un fichier XML. Si vous créez un nouveau <BUNDLE name="InstanceName" type="ClassName"> , vous pouvez ajouter librement des éléments et des attributs dans un espace de noms nouveau et vide.

Lorsque onSaveInstance(Bundle outState) de votre MainActivity est appelée (vous pouvez aussi forcer cela en), vous pouvez créer une nouvelle: Bundle b = new Bundle();

Ensuite, appelez votre (probablement pas hérité et non surchargée) méthode personnalisée onSaveInstance(Bundle b) dans votre propre classe avec votre Bundle nouvellement créé b. ensuite (en onSaveInstance(Bundle outState)) de votre MainActivity, appelez outState.putBundle("StringClassAndInstanceName", b);

Lorsque vous trouvez cette chaîne dans onCreate, vous pouvez utiliser un commutateur/cas pour recréer cet objet ou (mieux) ont une fonction d'usine dans votre classe personnalisée pour travailler avec Bundle et "StringClassAndInstanceName".

Questions connexes