Per lavorare con il ciclo di vita di Android framework e Fragment è necessario implementare il metodo onSaveInstanceState
nel frammento.Per semplicità ho assunto che si dispone di una matrice di valori di stringa che si può arrivare a (io in genere estendo ArrayAdapter per incapsulare vista di costruzione e di fornire un metodo comodo per accedere a tutto il set di dati sottostante):
public void onSaveInstanceState(Bundle savedState) {
super.onSaveInstanceState(savedState);
// Note: getValues() is a method in your ArrayAdapter subclass
String[] values = mAdapter.getValues();
savedState.putStringArray("myKey", values);
}
È possono poi recuperare i dati nel vostro metodo di onCreate (o onCreateView o onActivityCreated - vedi the Fragment JavaDoc) come questo:
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String[] values = savedInstanceState.getStringArray("myKey");
if (values != null) {
mAdapter = new MyAdapter(values);
}
}
...
}
Ciò garantisce che tutti gli eventi del ciclo di vita saranno trattati correttamente, senza perdita di dati, tra cui la rotazione del dispositivo e l'utente passaggio ad altre applicazioni. Il pericolo di non utilizzare onSaveInstanceState
e di utilizzare la memoria è il pericolo che Android recuperi quella memoria. Lo stato salvato non sarebbe influenzato da questo, ma l'utilizzo di variabili di istanza o di frammenti nascosti causerebbe la perdita di dati.
Se savedStateInstance
è nullo, non c'è stato da ripristinare.
if (values != null)
Il if (values != null)
è semplicemente di guardia contro la possibilità che nessun array è stato salvato, ma se si codifica il tuo ArrayAdapter per gestire un set di dati nullo non sarà necessario questo.
La soluzione definitiva, se le righe sono istanze di una delle proprie classi e non singoli elementi di dati, è quella di implementare l'interfaccia Parcelable su quella classe, quindi è possibile utilizzare savedState.putParcelableArray("myKey", myArray)
. Saresti sorpreso di quanto sia utile sapere come implementare Parcelable: ti permette di passare le tue lezioni all'interno di intenti e ti permette di scrivere molto codice più pulito.
http://developer.android.com/guide/topics/resources/runtime-changes.html – Raghunandan
è possibile controllare questo per i frammenti http://www.androiddesignpatterns.com/2013/04/retaining -objects-across-config-changes.html è possibile controllare onConfigurationChanged @ http://developer.android.com/reference/android/app/Fragment.html – Raghunandan
Cosa succede se si imposta l'ArrayAdapter static, nel controllo onCreate se è null , se lo crea, altrimenti chiama invalido su di esso (per forzare un ridisegno)? – Ethan