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.
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 falseOra modifico la variabile con il secondo pulsante:
09-04 22:56:17.483 9400-9400/com.example.antonello.tavolaccio I/System.out: trueTorno 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 falseEcco: 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 falseOra modifico la variabile:
09-04 23:05:30.863 18484-18484/com.example.antonello.tavolaccio I/System.out: trueE 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 trueE ottengo true.
Esperimento riuscito!
Nessun commento:
Posta un commento