2012-09-08 13 views
11

Ho una vista personalizzata che estende LinearLayout. Ho implementato onSaveInstanceState() e onRestoreInstanceState() per salvare lo stato attuale della vista. Tuttavia nessuna azione è presa. Quando inserisco un registro all'interno di questi due metodi, anche in Log Cat non viene visualizzato nulla. Suppongo che quei due metodi non vengano nemmeno chiamati. Qualcuno può spiegare dov'è il problema? Grazie.onSaveInstanceState() e onRestoreInstanceState (stato Parcelable) non vengono chiamati?

@Override 
public Parcelable onSaveInstanceState() { 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("instanceState", super.onSaveInstanceState()); 
    bundle.putInt("currentPage", currentPage); 
    return bundle; 
} 

@Override 
public void onRestoreInstanceState(Parcelable state) { 

    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentPage = bundle.getInt("currentPage"); 
     Log.d("State", currentPage + ""); 
     super.onRestoreInstanceState(bundle.getParcelable("instanceState")); 
     return; 
    } 
     super.onRestoreInstanceState(state); 
    } 

risposta

4

Dopo aver scavato in Android OS ho finalmente capito. Come sospettavo: non c'è niente di sbagliato in questi due metodi. Non vengono semplicemente chiamati. Sul Web puoi leggere che 'onRestoreInsatnceState viene chiamato quando viene ricreata l'attività' Ok, rende sens, ma non è completamente vero. Sì, onRestoreInstanceState() viene chiamato quando l'attività viene ricreato, ma solo se e solo se:

è stato ucciso dal sistema operativo. "Tale situazione accadere quando:

  • orientamento delle modifiche dispositivo (la vostra attività è distrutto e ricreato)
  • c'è un'altra attività di fronte al vostro e ad un certo punto il sistema operativo uccide la vostra attività al fine di liberare la memoria (ad esempio). La prossima volta che avvierai la tua attività verrà chiamato onRestoreInstanceState(). "

Quindi, se siete nella vostra attività e si ha colpito di nuovo il pulsante sul dispositivo, la vostra attività è finitura() ed e la prossima volta che si avvia la vostra applicazione viene avviato di nuovo (che suona come ri-creato, non è?) ma questa volta senza stato salvato perché è stato chiuso intenzionalmente quando si preme il pulsante Indietro.

+6

ho avuto lo stesso problema, ma era perché la mia abitudine 'View' non ha avuto un set di' id'. Dai documenti _ "Nota che anche se il blocco è abilitato, alla vista deve ancora essere assegnato un ID (tramite setId (int)) per il suo stato da salvare." _ –

3

Come il commento di Steven Byle menzionato, a una persona View deve essere assegnato un ID per onSaveInstanceState da chiamare. Ho compiuto questo impostando un id nel mio costume View costruttore:

public class BoxDrawingView extends View { 
    private int BOX_DRAWING_ID = 555; 
    … 

    public BoxDrawingView(Context context, AttributeSet attrs) { 
     … 
     this.setId(BOX_DRAWING_ID); 
    } 
    … 

} 
+0

Questo è pericoloso. Nel caso in cui si aggiungano più 'BoxDrawingView nello stesso layout, tutti verranno ripristinati con lo stesso stato dell'ultimo aggiunto! – Antimonit

+0

A livello di API c'è una soluzione a questo problema: utilizzare View.generateViewId(): https://developer.android.com/reference/android/view/View.html#generateViewId() – bw15

Problemi correlati