JavascriptProva

domenica 4 settembre 2016

Save Instance State.

Esercizio con onSaveInstanceState.

Impostare una variabile booleana e conservarla attraverso i cambiamenti di status di un'activity mediante onSaveInstanceState.

Partiamo da questo scheletro:
public class MainActivity extends AppCompatActivity {

    
    Button bttCambia;
    Button bttModifica;
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bttCambia=(Button)findViewById(R.id.button);
        bttModifica=(Button)findViewById(R.id.button3);
        

    }



}
Metto una variabile booleana, con un pulsante che modifica questa variabile da falsa a vera e un pulsante che cambia activity, chiamando quindi le funzioni onPause e onStop.
public class MainActivity extends AppCompatActivity {


    Button bttCambia;
    Button bttModifica;
    
    boolean Variabile;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bttCambia=(Button)findViewById(R.id.button);
        bttModifica=(Button)findViewById(R.id.button3);

        Variabile=false;
        
        bttCambia.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent(getApplicationContext(),Seconda.class);
                startActivity(intent);
            }
        });
        
        bttModifica.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Variabile=true;
            }
        });
        
        
        
    }

}
Ora verifico se quando viene chiamato onStart la variabile è sempre uguale anche dopo che è stata modificata dal pulsante "Modifica":
  • partenza del programma
  • cambio activity con evocazione di onPause e onStop;
  • ritorno all'activity principale con evocazione di onStart e onResume: Segnale sul valore della variabile;
  • modifica della variabile con il pulsante "Modifica";
  • cambio activity con evocazione di onPause e onStop;
  • ritorno all'activity principale con evocazione di onStart e onResume: Segnale sul valore della variabile per vedere se risulta modificata o no.
Per realizzare questo metto onStart con la segnalazione:
public class MainActivity extends AppCompatActivity {


    Button bttCambia;
    Button bttModifica;

    boolean Variabile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bttCambia=(Button)findViewById(R.id.button);
        bttModifica=(Button)findViewById(R.id.button3);

        Variabile=false;

        bttCambia.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent(getApplicationContext(),Seconda.class);
                startActivity(intent);
            }
        });

        bttModifica.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Variabile=true;
                System.out.println(Variabile);
            }
        });



    }
    
    @Override
    protected void onStart(){
        super.onStart();
        System.out.println("VARIABILE IN ONSTART "+Variabile);
    }

}
Ho messo un segnale anche quando viene modificata la variabile, per essere sicuro che sia stata modificata.
Sono andato sulla seconda activity e torno indietro, evocando onStart:
09-04 22:54:04.203 3344-3344/com.example.antonello.tavolaccio I/System.out: VARIABILE IN ONSTART false
Ora modifico la variabile con il secondo pulsante:
09-04 22:56:17.483 9400-9400/com.example.antonello.tavolaccio I/System.out: true
Torno alla seconda activity e poi torno indietro evocando di nuovo onStart:
09-04 22:57:02.167 9400-9400/com.example.antonello.tavolaccio I/System.out: VARIABILE IN ONSTART false
Ecco: la variabile modificata non è stata salvata con il "ritiro" dell'activity principale allo stato onCreate.


Adesso tentiamo di applicare il salvataggio in Bundle savedInstanceState.
Aggiungo la funzione onSaveInstanceState:
    @Override
    protected void onSaveInstanceState(Bundle state){
        
    }
che va riempita così:
    @Override
    protected void onSaveInstanceState(Bundle state){
        state.putSerializable("Variabile",Variabile);
    }
Dopo aver memorizzato nel Bundle la Variabile (ciò accade quando l'activity si "ritira", prima di onStop) devo retrievarlo in fase onCreate.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bttCambia=(Button)findViewById(R.id.button2);
        bttModifica=(Button)findViewById(R.id.button3);

        Variabile=false;
        
        if(savedInstanceState!=null && savedInstanceState.getSerializable("Variabile")!=null){
            Variabile=(boolean)savedInstanceState.getSerializable("Variabile");
        }
Il retrieve l'ho messo dopo l'attribuzione in fase iniziale della variabile, ovviamente, altrimenti essa sarebbe stata ristabilita come prima.
Adesso rifacciamo la prova.

Vado all'activity Seconda e poi torno indietro evocando onStart:
09-04 23:04:43.477 18484-18484/com.example.antonello.tavolaccio I/System.out: VARIABILE IN ONSTART false
Ora modifico la variabile:
09-04 23:05:30.863 18484-18484/com.example.antonello.tavolaccio I/System.out: true
E rifaccio il procedimento di prima, passando all'activity Seconda e poi tornando indietro con evocazione di onStart:
09-04 23:06:28.279 18484-18484/com.example.antonello.tavolaccio I/System.out: VARIABILE IN ONSTART true
E ottengo true.

Esperimento riuscito!

Nessun commento:

Posta un commento