2011-05-18 20 views
28

Conozco el estado de actividad de guardar y restaurar. Pero lo que quiero hacer es guardar y restaurar el estado de una vista. tengo una vista personalizada y dos métodos overrided en ella:Guardar y restaurar ver estado android

@Override 
protected void onRestoreInstanceState(Parcelable state) { 
    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentLeftX = bundle.getInt(CURRENT_LEFT_X_PARAM, 0); 
     currentTopY = bundle.getInt(CURRENT_TOP_Y_PARAM, 0); 
    } 
    super.onRestoreInstanceState(state); 
} 

@Override 
protected Parcelable onSaveInstanceState() { 
    super.onSaveInstanceState(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX); 
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY); 
    return bundle; 
} 

que esperaba que esto funcione sin problemas, pero se encontró con y error:

Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.os.Bundle instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/mapViewId. Make sure other views do not use the same id. at android.view.View.onRestoreInstanceState(View.java:6161)

Pero este punto de vista es el único en mi actividad. Entonces, estoy preguntando:

¿Cuál es la forma correcta de guardar el estado de la vista?

+0

tuve que reír, porque de lo ridícula que es el diseño de Android. El método no espera Ver el estado *** obviamente ***, *** obviamente *** espera una interfaz llamada *** Parcelable ***. Y sí, devolvemos un *** *** Parcelable *** válido que se implementa con *** Bundle ***. Pero falló por una razón ridícula. Nunca he encontrado este tipo de diseño en .NET, cuando espera una interfaz, no debería haber ninguna excepción si devolvemos esa interfaz exacta. La excepción debería decir algo más que tenga más sentido =))) Android es un gran ejemplo de cómo el diseño *** malo *** puede hacerte enojar. –

Respuesta

-3

puedo estar equivocado, pero creo que es necesario guardar el paquete, los padres devuelve:

@Override 
protected Parcelable onSaveInstanceState() { 
    Parcelable bundle = super.onSaveInstanceState(); 
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX); 
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY); 
    return bundle; 
} 

De lo contrario estás perdiendo todo la superclase guardada

+4

implementación predeterminada de onSaveInstanceState devuelve nulo. Además, el paquete aquí es Parcelable, que no tiene ningún método como putInt. –

Cuestiones relacionadas