Estoy intentando guardar y restaurar una jerarquía de vista que consiste en una tabla de botones. El número de filas de tablas y botones necesarios en la tabla no se conoce hasta el tiempo de ejecución, y se agregan mediante programación a un diseño xml inflado en el método Activity
onCreate(Bundle)
. Mi pregunta es: ¿la mesa final se puede guardar y restaurar usando la vista predeterminada de Android para guardar/restaurar la implementación?Restaurar la jerarquía de vista desde el estado guardado no restaura las vistas agregadas de forma programática
A continuación, se incluye un ejemplo de mi intento actual. En la ejecución inicial, la tabla se construye como se esperaba. Cuando se destruye la actividad (girando el dispositivo), la vista reconstruida muestra solo un TableLayout
vacío sin hijos.
El archivo xml al que se hace referencia en setContentView(int)
incluye, entre otras cosas, el TableLayout
vacío al que se agregan los botones.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Setup this activity's view.
setContentView(R.layout.game_board);
TableLayout table = (TableLayout) findViewById(R.id.table);
// If this is the first time building this view, programmatically
// add table rows and buttons.
if (savedInstanceState == null) {
int gridSize = 5;
// Create the table elements and add to the table.
int uniqueId = 1;
for (int i = 0; i < gridSize; i++) {
// Create table rows.
TableRow row = new TableRow(this);
row.setId(uniqueId++);
for (int j = 0; j < gridSize; j++) {
// Create buttons.
Button button = new Button(this);
button.setId(uniqueId++);
row.addView(button);
}
// Add row to the table.
table.addView(row);
}
}
}
Mi entendimiento es que Android guarda el estado de puntos de vista, siempre y cuando tengan un ID asignado a ellos, y restaura los puntos de vista cuando se recrea la actividad, pero ahora parece volver a inflar el diseño xml y nada Más. Al depurar el código, puedo confirmar que se llama a onSaveInstanceState()
en cada Button
en la tabla, pero no a onRestoreInstanceState(Parcelable)
.
Correcto: el marco guarda y restaura el estado de cada vista, pero no guarda qué vistas existen. Es por eso que tienes que llamar a 'setContentView()' independientemente de si 'savedInstanceState' es nulo, y de la misma manera tienes que crear cualquier vista dinámica dentro de' onCreate() '(o' onCreateView() 'para los fragmentos). Tenga en cuenta que si agrega vistas más adelante (por ejemplo, en 'onStart()'), es demasiado tarde para que se restauren sus contenidos. –
Entonces, básicamente, si mi Actividad tiene varias vistas y fragmentos generados a través de la interacción del usuario, ¿necesito recordar cada ID, cada vista y cada tipo de Fragmento? ¿Cuál es el motivo de esta choce? ¿Por qué no simplemente restablecen todo como era cuando la aplicación fue asesinada? –
¿Qué pasa si las vistas no se pueden agregar durante onCreate? –