He encontrado muchas instancias de una pregunta similar sobre SO, pero desafortunadamente ninguna respuesta cumple con mis requisitos.
Tengo diferentes diseños para retrato y paisaje y estoy usando back stack, lo que me impide usar setRetainState()
y trucos usando rutinas de cambio de configuración.
Muestro cierta información al usuario en TextViews, que no se guardan en el controlador predeterminado. Al escribir mi solicitud únicamente con Actividades, lo siguiente funcionó bien:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Con Fragment
s, esto funciona solo en situaciones muy específicas. Específicamente, lo que se rompe horriblemente es reemplazar un fragmento, colocarlo en la pila posterior y luego girar la pantalla mientras se muestra el nuevo fragmento. Por lo que entendí, el antiguo fragmento no recibe una llamada onSaveInstanceState()
cuando se reemplaza, pero permanece vinculado de alguna manera al Activity
y este método se llama más tarde cuando View
ya no existe, por lo que busca cualquiera de mis TextView
resultados en a NullPointerException
.
Además, descubrí que mantener la referencia a mi TextViews
no es una buena idea con Fragment
s, incluso si estaba bien con Activity
s. En ese caso, en onSaveInstanceState()
realidad guarda el estado, pero el problema vuelve a aparecer si giro la pantalla dos veces cuando el fragmento está oculto, ya onCreateView()
que no se llama en la nueva instancia.
Pensé en salvar el estado en el onDestroyView()
en algún Bundle
elemento de miembro de la clase de tipo (en realidad es más datos, no sólo uno TextView
) y el ahorro que en onSaveInstanceState()
pero hay otros inconvenientes. Principalmente, si el fragmento se muestra actualmente, el orden de invocar las dos funciones se invierte, por lo que necesitaría tener en cuenta dos situaciones diferentes. ¡Debe haber una solución más limpia y correcta!