Android Guardar el estado de un Activity

Al momento de generar valores puedes necesitar guardar estos cuando el usuario por ejemplo rota el dispositivo.

Para este propósito Android te provee de dos métodos que debes sobreescribir en tu Activity onSaveInstanceState y onRestoreInstanceState

public void onSaveInstanceState(Bundle savedInstanceState) {}

public void onRestoreInstanceState(Bundle savedInstanceState) {}

Debes utilizar el Bundle que que recibes como parámetro en ambos métodos.

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
   super.onSaveInstanceState(savedInstanceState);

   // Save in savedInstanceState.
   savedInstanceState.putStringArray(SPINNER_DATA, colors);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
   super.onRestoreInstanceState(savedInstanceState);

   // Restore state from the savedInstanceState.
   if(savedInstanceState != null) {
       colors = savedInstanceState.getStringArray(SPINNER_DATA);
       addColors(colors);
   }

Codigo completo de ejemplo para guardar el state de un Activity

Este ejemplo supone que al hacer clic en el botón se ejecuta la acción de crear cierta información, aqui será crear un array de colores, y cargarlo en el spinner.

Este array deseas conservarlo si el usuario rota la pantalla o cambia a otra aplicación y por ello utilizarás los métodos previstos onSaveInstanceState y onRestoreInstanceState.

public class MainActivity extends AppCompatActivity {

   private static final String SPINNER_DATA = "SPINNER_DATA";
   private Spinner spinner;
   private String colors[]  = new String[0];

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       spinner = (Spinner) findViewById(R.id.spinner);
   }

   @Override
   public void onSaveInstanceState(Bundle savedInstanceState) {
       super.onSaveInstanceState(savedInstanceState);

       // Save in savedInstanceState.
       savedInstanceState.putStringArray(SPINNER_DATA, colors);
   }

   @Override
   public void onRestoreInstanceState(Bundle savedInstanceState) {
       super.onRestoreInstanceState(savedInstanceState);

       // Restore state from the savedInstanceState.
       if(savedInstanceState != null) {
           colors = savedInstanceState.getStringArray(SPINNER_DATA);
           addColors(colors);
       }

   }

   /**
    * Click button
    */
   public void doColors(View view) {

       // super simple data for this example
       colors = new String[]{"Red", "Blue", "White", "Yellow", "Black", "Green", "Purple", "Orange", "Grey"};
       addColors(colors);

   }

   /**
    * Add data to spinner
    */
   private void addColors(String[] colorsToAdd) {
       ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, colorsToAdd);
       spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
       spinner.setAdapter(spinnerArrayAdapter);
   }

}

..

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.gustavopeiretti.myapplication.MainActivity">
    
        <Button
            android:text="Click Me"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="33dp"
            android:id="@+id/button"
            android:onClick="doColors"/>
    
        <Spinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="69dp"
            android:id="@+id/spinner" />
    
    </RelativeLayout>

Descarga este código completo

Hi! If you find my posts helpful, please support me by inviting me for a coffee :)

Ver también