2010-07-03 13 views

risposta

51

Gli oggetti personalizzati possono essere salvati in un pacchetto quando implementano l'interfaccia Parcelable. allora possono essere salvati attraverso:

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

In sostanza i seguenti metodi devono essere implementati nel file di 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

Trovo che sia meno lavoro da tradurre in e da JSON, rispetto a – Arcantos

+0

parcellizzabile suSaveInstanceState dovrebbe essere alla fine della funzione! https://developer.android.com/training/basics/activity-lifecycle/recreating.html –

+0

Mentre questo è il modo giusto per salvare l'oggetto personalizzato in onSaveInstanceState(), dovresti assicurarti di non salvare grandi oggetti usando questo metodo . Questo è solo per salvare lo stato dello schermo. Se gli oggetti diventano grandi, c'è la possibilità che tu riceva l'eccezione "TransactionTooLargeException' – abat

1

Verificare this risposta.

Fondamentalmente è necessario salvarlo all'interno di un Bundle.

+0

Ok grazie, forse non ero abbastanza chiaro. Quello che volevo sapere è come salvare un oggetto * personalizzato *. Ho scoperto che posso renderlo parcelable. – jul

3

So "che questo caso è freddo", ma perché ho trovato questa discussione prima, mentre cercavo esattamente la stessa cosa (e ho trovato una risposta):

Immagina Bundle come un file XML. Se si crea un nuovo <BUNDLE name="InstanceName" type="ClassName"> è possibile aggiungere liberamente elementi e attributi in uno spazio dei nomi fresco e vuoto.

Quando onSaveInstance(Bundle outState) della vostra MainActivity si chiama (si può anche forzare questo in), è possibile creare una nuova: Bundle b = new Bundle();

Quindi chiamare il vostro (probabilmente non ha ereditato e non sovrascritto) personalizzato Metodo onSaveInstance(Bundle b) nella propria classe con il tuo pacchetto appena creato b. Poi (in onSaveInstance(Bundle outState)) del vostro MainActivity, chiamare outState.putBundle("StringClassAndInstanceName", b);

Quando si trova questa stringa nella onCreate, è possibile utilizzare uno switch/case per ricreare questo oggetto o (meglio) hanno una funzione di fabbrica in classe personalizzata per lavorare con Bundle e "StringClassAndInstanceName".

Problemi correlati