Autore Topic: onSaveInstanceState() non viene richiamato  (Letto 831 volte)

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
onSaveInstanceState() non viene richiamato
« il: 17 Settembre 2013, 07:55:08 CEST »
0
Salve, il mio problema è che quando il dispostivo va da portrait a landscape o viceversa, il risultato stampato nella TextView scompare, allora cercando su internet ho trovato qualcosa e ho provato alla seguente maniera:

Codice (Java): [Seleziona]
protected void onSaveInstanceState(Bundle savedInstanceState) {
                  super.onSaveInstanceState(savedInstanceState);
                  savedInstanceState.putInt("param", x);
                  Log.i("i", "Salva la variabile x");
                }

e nell'onCreate() :

Codice (Java): [Seleziona]
if (savedInstanceState!= null){
                         x = savedInstanceState.getInt("param");
                         Log.i("i", "Salva la variabile x");
                }

Dove la "x" è un parametro intero sui cui faccio dei calcoli, in un altro metodo, e che assegno alla TextView per settarne il testo, ma il problema è che quando ruoto il dispositivo, il metodo onSaveInstanceState() non viene richiamato e il valore viene perso, ma non capisco perché  >:( Grazie mille per l'aiuto  :-)
Vincenzo Cimino @ Google Play Store


Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:onSaveInstanceState() non viene richiamato
« Risposta #1 il: 17 Settembre 2013, 16:11:29 CEST »
0
Fai una cosa: innanzitutto sopra la segnatura del metodo scrivi @Override. Inoltre nel logcat riesci a leggere il messaggio che stampi in onSaveInstanceState?

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:onSaveInstanceState() non viene richiamato
« Risposta #2 il: 17 Settembre 2013, 21:33:45 CEST »
0
Fatto. E no, non c'è nei logcat il messaggio.
Vincenzo Cimino @ Google Play Store


Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:onSaveInstanceState() non viene richiamato
« Risposta #3 il: 17 Settembre 2013, 22:34:35 CEST »
0
A parte che potresti salvare il valore nelle sharedpreference o con un singleton, comunque fammi pensare il perchè non funziona onSaved...

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:onSaveInstanceState() non viene richiamato
« Risposta #4 il: 18 Settembre 2013, 04:44:18 CEST »
0
Quindi quale potrebbe essere una soluzione alternativa?  :-)
Vincenzo Cimino @ Google Play Store


Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:onSaveInstanceState() non viene richiamato
« Risposta #5 il: 18 Settembre 2013, 05:39:01 CEST »
0
Se vuoi usare un singleton, basta che crei ad esempio una classe del genere:

Codice (Java): [Seleziona]
public class Urlnull {
    private static SingleTon mInstance= null;

   
    public String testoDaSalvare;
   
   

    protected SingleTon()
    {
       
    }

    public static synchronized Urlnull getInstance(){
        if(null == mInstance){
                mInstance = new Urlnull();
        }
        return mInstance;
    }
   
   
 
}

In questo caso hai una sola variabile di tipo String, che corrisponde alla stringa che vuoi salvare, ma potresti avere altri tipi di variabile. Ovviamente ti conviene usare questo procedimento se i dati che vuoi salvare sono pochi. Se si tratta di una stringa ad esempio va bene. Quindi, ogni qual volta vuoi salvare la tua stringa basta fare:

Codice (Java): [Seleziona]
SingleTon.getInstance().testoDaSalvare=stringaCheVuoiSalvare;
mentre per prendere il valore che hai salvato basta fare:

Codice (Java): [Seleziona]
String stringaRecuperata=SingleTon.getInstance().testoDaSalvare
Se invece vuoi usare le shared preference ci sono un miliardo di guide su internet, prova a vedere qui: http://stackoverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:onSaveInstanceState() non viene richiamato
« Risposta #6 il: 18 Settembre 2013, 09:05:04 CEST »
0
Stai usando Activity o Fragment?
hai per caso inserito android:configChanges="orientation"> nel Manifest?
Stai semplicemente ruotando il dispositivo o magari stai usando il back?

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:onSaveInstanceState() non viene richiamato
« Risposta #7 il: 18 Settembre 2013, 19:16:16 CEST »
0
Se vuoi usare un singleton, basta che crei ad esempio una classe del genere:

Codice (Java): [Seleziona]
public class Urlnull {
    private static SingleTon mInstance= null;

   
    public String testoDaSalvare;
   
   

    protected SingleTon()
    {
       
    }

    public static synchronized Urlnull getInstance(){
        if(null == mInstance){
                mInstance = new Urlnull();
        }
        return mInstance;
    }
   
   
 
}
Mi da questo errore al SingleTon:
"- SingleTon cannot be resolved to a type"

Se invece vuoi usare le shared preference ci sono un miliardo di guide su internet, prova a vedere qui: http://stackoverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values
Le ho provate tutte, ma non riesco comunque a farlo funzionare  :-o

Stai usando Activity o Fragment?
hai per caso inserito android:configChanges="orientation"> nel Manifest?
Stai semplicemente ruotando il dispositivo o magari stai usando il back?

Un activity.
No, non l'ho inserito.
Sto semplicemente ruotando il dispositivo.
Vincenzo Cimino @ Google Play Store


Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:onSaveInstanceState() non viene richiamato
« Risposta #8 il: 19 Settembre 2013, 04:13:58 CEST »
0
Citazione
Mi da questo errore al SingleTon:
"- SingleTon cannot be resolved to a type"

Ti da quell'errore perché volevo cambiare il nome della classe ma poi ho cambiato idea, quindi al posto di SingleTon devi scrivere Urlnull. Nel tuo caso:

Codice (Java): [Seleziona]
    private static Urlnull mInstance= null;

// e poi qui:
protected Urlnull()
{}

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:onSaveInstanceState() non viene richiamato
« Risposta #9 il: 19 Settembre 2013, 14:38:06 CEST »
0
Non funziona.
Allora, io eseguo dei calcoli sul parametro intero x, in un metodo chiamato setX(), che viene poi richiamato in dei controlli dentro uno switch di un altro metodo, chiamato getX(), quest'ultimo verrà poi richiamato nell'OnCreate() dentro dei TextChangedListener dopo che il testo dell'EditText sarà cambiato.
Quindi ho provato a richiamare getX(), non appena il dispositivo verrà ruotato in questa maniera:

Codice (Java): [Seleziona]
if(savedInstanceState != null){
                        getX();
                }

Ma il problema è che così facendo, non prende in input quello che c'è scritto nelle EditText e da un NumberFormatException. Come posso fare a prendere in input il testo precedentemento scritto?  :-o Grazie mille per la pazienza e l'aiuto  :D

P.S L'inputType delle EditText è number.


Post unito: 20 Settembre 2013, 20:54:34 CEST

Ok infine ho risolto creando un metodo che ritorna il testo della textview:

Codice (Java): [Seleziona]
@Override
        public Object onRetainNonConfigurationInstance()
        {        
            return tvgiorno.getText().toString();
        }

E nell'oncreate, ricreo la textview con lo stesso testo richiamando il metodo di prima:

Codice (Java): [Seleziona]
String  phonenumber= (String)extracted();
                   if (phonenumber != null) {
                      TextView FirstName = (TextView) findViewById(R.id.textView2);
                      FirstName.setText(phonenumber);
                   }

Grazie mille a tutti per l'aiuto  :D
« Ultima modifica: 20 Settembre 2013, 20:54:34 CEST da Vincenzoz, Reason: Merged DoublePost »
Vincenzo Cimino @ Google Play Store