Autore Topic: Salvare stato activity attraverso onsaveinstance  (Letto 1137 volte)

Offline jox

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
Salvare stato activity attraverso onsaveinstance
« il: 04 Novembre 2013, 15:27:11 CET »
0
ragazzi ho un problema, devo poter salvare lo stato della mia activity dopo le modifiche fatte dall'utente in modo che richiamando questa activity da qualsiasi altra activity mi riparte dal punto in cui l'ho lasciata. ovviamente chiudendo e riaprendo l'applicazione si resetta tutto e ricomincia da capo. ho letto l'esistenza del metodo onsavedinstance ma mi pare che salva solo determinati elementi non tutta l'activity con tutti i layout imageview ecc..qualcuno potrebbe spiegarmi meglio come funziona??

Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:Salvare stato activity attraverso onsaveinstance
« Risposta #1 il: 04 Novembre 2013, 17:03:55 CET »
+2
Spiego in sintesi come Android gestisce il salvataggio/ripristino dell'activity
Due metodi sono necessari: onSaveInstanceState() ed onRestoreInstanceState() (in questo esempio il ripristino avviene nell'onCreate, ma entrambi i metodi sono validi). Questa immagine (presa dalla documentazione di Android) sintetizza come operano questi metodi:
È dunque lo sviluppatore che, ridefinendo tali metodi, sceglie cosa conservare e cosa no al ripristino dell'Activity. Riporto il codice di esempio preso dal link indicato sopra:

Salvataggio dei dati: con questo metodo salvi nell'oggetto Bundle i tuoi dati, in questo caso due interi, che andrai a riprendere quando necessario
Codice (Java): [Seleziona]
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
   
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

Recupero dei dati: all'avvio dell'Activity (dunque nell'onCreate) si fa il controllo sull'oggetto Bundle (che viene passato dal sistema all'onCreate). Se questo non è null significa che c'è uno stato dell'Activity salvato con il metodo appena visto ed è quindi necessario riprendere i dati (i due interi salvati in precedenza)
Codice (Java): [Seleziona]
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
   
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

Esistono metodi per salvare in modo molto semplice, come visto, dei dati nell'oggetto Bundle (putInt, putString, putBoolean, ecc). Per salvare dati più complessi si devono utilizzare tecniche altrettanto più complesse.
Per salvare l'ImageView puoi salvare una String con l'URI dell'immagine contenuta oppure un int con l'id della risorsa (R.drawable.ecc). Questo è giusto un esempio, se specifichi esattamente cosa hai bisogno di salvare possiamo trovare una soluzione migliore  :-)
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline jox

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
Re:Salvare stato activity attraverso onsaveinstance
« Risposta #2 il: 04 Novembre 2013, 17:18:56 CET »
0
Prima di tutto grazie per la risposta sei stato chiarissimo :)
in pratica ho un'activityA formata da layout1 e layout2 ho degli oggetti nel layout1 che l'utente a piacere può trascinare nel layout2, in questa activity inoltre c'è un button che se cliccato porta ad un activityB che attraverso button porta ad altre activity, se da una qualsiasi activity io richiamo l'activityA voglio che si riavvii non nello stato iniziale ma nello stato in cui è rimasta dopo che l'utente ha trascinato gli oggetti. Spero che tu possa aiutarmi!!

Post unito: 04 Novembre 2013, 17:25:38 CET
Anche se è offtopic come faccio a mettere thanks per ringraziarti??
« Ultima modifica: 04 Novembre 2013, 17:25:38 CET da jox, Reason: Merged DoublePost »

Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:Salvare stato activity attraverso onsaveinstance
« Risposta #3 il: 04 Novembre 2013, 17:28:45 CET »
0
Gli elementi dei layout sono sempre uguali e l'unica cosa che cambia è se si trovano nel layout1 o nel layout2?
Se così fosse puoi creare due array di interi elementi1 ed elementi2 in cui nel primo metti gli id di tutti i componenti del primo layout e nel secondo gli id dei componenti del secondo layout. Salvi e riprendi questi array con i metodi indicati nel primo post:
Codice (Java): [Seleziona]
savedInstanceState.putIntArray("elementi1", elementi1);
Per il thanks dovrebbe esserci il pulsante in alto a destra su ogni post (vedi immagine allegata) :)
« Ultima modifica: 04 Novembre 2013, 17:33:51 CET da vincenzoc »
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline jox

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
Re:Salvare stato activity attraverso onsaveinstance
« Risposta #4 il: 04 Novembre 2013, 17:58:45 CET »
0
se possibile vorrei riuscire a salvare e ripristinare i layout perche ci sono altre cose all'interno dei layout che potrebbero essere modificate