studio - onattach fragment android
¿Cómo funciona `onViewStateRestored` from Fragments? (1)
Estoy realmente confundido con el estado interno de un Fragmento. Tengo una Actividad que contiene solo un Fragmento a la vez y la reemplaza, si se muestra otro Fragmento. Desde los documentos, se llama SOLO a onSaveInstanceState
está onSaveInstanceState
Activitys onSaveInstanceState
(lo que no se llama en mi caso).
Si detengo mi Fragmento, almacenaré su estado dentro de un Singleton (sí, sé que odio a Singletons también, pero no fue mi idea hacerlo). Así que tengo que recrear todo ViewHirarchy
, crear nuevas vistas (usando la palabra clave new
), restaurar su estado y devolverlas en onCreateView
. También tengo una casilla de verificación dentro de esta vista desde la cual explícitamente NO quiero almacenar su estado.
Sin embargo, FragmentManager
quiere ser "inteligente" y llama onViewStateRestored
con un paquete que nunca creé, y "restaura" el estado del antiguo CheckBox
y lo aplica a mi NUEVO CheckBox. Esto arroja tantas preguntas:
¿Puedo controlar el paquete desde onViewStateRestored
?
¿Cómo el FragmentManager toma el estado de un CheckBox (probablemente recolectado como basura) y lo aplica al nuevo?
¿Por qué solo guarda el estado de la casilla de verificación (no de TextViews?)
Para resumir: ¿cómo funciona onViewStateRestored
?
Tenga en cuenta que estoy usando Fragmentv4, por lo que no se requiere API> 17 para onViewStateRestored
Bueno, a veces los fragmentos pueden ser un poco confusos, pero después de un tiempo te acostumbrarás a ellos y aprenderás que, después de todo, son tus amigos.
Si en el método onCreate () de su fragmento, usted hace: setRetainInstance (true); El estado visible de sus vistas se mantendrá, de lo contrario no se mantendrá.
Supongamos que un fragmento llamado "f" de la clase F, su ciclo de vida sería así: - Al crear una instancia / adjuntar / mostrar, esos son los métodos de la f que se llaman, en este orden:
F.newInstance();
F();
F.onCreate();
F.onCreateView();
F.onViewStateRestored;
F.onResume();
En este punto, su fragmento será visible en la pantalla. Supongamos que el dispositivo se gira, por lo tanto, la información del fragmento debe conservarse, este es el flujo de eventos desencadenados por la rotación:
F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW.
F.onDestroyView(); //destroy any extra allocations your have made
//here starts f''s restore process
F.onCreateView(); //f''s view will be recreated
F.onViewStateRestored(); //load your info and restore the state of f''s view
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here.
//store the information using the correct types, according to your variables.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("foo", this.foo);
outState.putBoolean("bar", true);
}
@Override
public void onViewStateRestored(Bundle inState) {
super.onViewStateRestored(inState);
if(inState!=null) {
if (inState.getBoolean("bar", false)) {
this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo");
}
}
}