2012-09-08 22 views
11

Tengo una vista personalizada que extiende LinearLayout. Implementé onSaveInstanceState() y onRestoreInstanceState() para guardar el estado de vista actual. Sin embargo, no se realiza ninguna acción. Cuando coloco un registro dentro de esos dos métodos, tampoco aparece nada en Log Cat. Supongo que esos dos métodos ni siquiera son llamados. ¿Alguien puede explicar dónde está el problema? Gracias.onSaveInstanceState() y onRestoreInstanceState (estado Parcelable) no se llaman?

@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); 
    } 

Respuesta

4

Después de cavar en Android OS, finalmente me he dado cuenta. Como sospechaba: no hay nada de malo en esos dos métodos. Simplemente no son llamados. En la Web, puede leer que se llama a 'onRestoreInsatnceState cuando se recrea la actividad' Bien, tiene sentido, pero no es completamente cierto. Sí, se llama a onRestoreInstanceState() cuando se recrea la actividad pero solo iff:

fue destruido por el OS. "Tal situación ocurre cuando:

  • orientación de los cambios de dispositivo (su actividad es destruido y recreado)
  • hay otra actividad frente a la suya y en algún momento el sistema operativo mata a su actividad con el fin de liberar memoria (por ejemplo). La próxima vez que inicie su actividad enRestoreInstanceState() se llamará ".

Así que si usted está en su actividad y que golpear el botón Atrás en el dispositivo, su actividad está acabado() ed y la próxima vez que inicie su aplicación se inicia de nuevo (que suena como re-creado, ¿no es así?) pero esta vez sin estado guardado porque lo abandonó intencionalmente al presionar el botón Atrás.

+6

que tenían el mismo problema, pero era porque mi costumbre 'View' no tenía un conjunto' id'. Desde el documento _ "Tenga en cuenta que incluso si el congelamiento está habilitado, la vista todavía debe tener una identificación asignada (a través de setId (int)) para que se guarde su estado." _ –

3

Como se mencionó en el comentario de Steven Byle, un View personalizado debe tener una identificación asignada para que se llame onSaveInstanceState. Me logrado esto mediante el establecimiento de un id en mi constructor de encargo View:

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

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

} 
+0

Esto es peligroso. En caso de que agregue múltiples 'BoxDrawingView's en el mismo diseño, ¡todos serán restaurados con el mismo estado que el último agregado! – Antimonit

+0

A partir del nivel de la API, existe una solución para ese problema: use View.generateViewId(), consulte: https://developer.android.com/reference/android/view/View.html#generateViewId() – bw15

Cuestiones relacionadas