Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Android] onSaveInstanceState/onRestoreInstanceState

    Ciao a tutti, sto cercando di capire come salvare gli stati dell'activity per renderli disponibili anche dopo essere entrato in un'altra activity e successivamente tornati indietro.

    Nella mia MainActivity (dopo che si è aperto un dialog che richiede di inserire un nome) viene stampato un messaggio di benvenuto personalizzato (TextView), che dopo essere entrati in una seconda activity ed essere tornati indietro scompare.

    Già qui non capisco il motivo, visto che ho letto dalla documentazione ufficiale che le view vengono salvate automaticamente dal sistema...

    Ho provato quindi a salvarlo manualmente:

    codice:
    @Override
    public void onSaveInstanceState (Bundle state)
    {
        super.onSaveInstanceState(state);
    
        TextView welcoming = (TextView) findViewById(R.id.welcoming);
        String welcomingString = (String) welcoming.getText();
        state.putString("Username", welcomingString);
    }
    
    @Override
    public void onRestoreInstanceState (Bundle state)
    {
        super.onRestoreInstanceState(state);
        TextView welcoming = (TextView) findViewById(R.id.welcoming);
        welcoming.setText(state.getString("Username"));
        
    }

    La stringa viene salvata correttamente all'interno del bundle, il problema è che il metodo onRestoreInstanceState non viene mai eseguito quando faccio ritorno in quell'activity.

    Ho provato inoltre a recuperare il bundle all'interno dell'onCreate dell'activity stessa ma questo risulta null, nonostante io ci abbia salvato la stringa di benvenuto.

    Mi aiutate?
    Ultima modifica di Leonerd; 16-12-2016 a 14:03

  2. #2
    ciao!

    sinceramente non saprei se può essere quello il motivo.
    ma io fare cmq in altro modo:
    codice:
    public class MyActivity {
        private TextView welcoming = null;
        private String welcomingString = null;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            welcoming = (TextView) findViewById(R.id.welcoming);
            welcomingString = welcoming.getText();
        }
        
        @Override
        public void onSaveInstanceState (Bundle state) {
            super.onSaveInstanceState(state);
            state.putString("Username", welcomingString);
        }
    
        @Override
        public void onRestoreInstanceState (Bundle state) {
            super.onRestoreInstanceState(state);
            welcoming.setText(state.getString("Username"));
        }
    }
    inoltre, quel state.getString("Username"), sei sicuro sia valorizzato in maniera corretta??

  3. #3
    Ho provato e continua a non funzionare.

    In che senso valorizzato in maniera corretta? All'interno di onSaveInstanceState ho provato System.out.println(state.getString("Username")) e stampa correttamente la stringa di benvenuto

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Al momento non ho modo di verificare, ma da quel che so i metodi onSaveInstanceState() / onRestoreInstanceState() vengono richiamati dal sistema quando l'Activity viene distrutta / ricreata in seguito a determinate operazioni del sistema operativo: l'esempio più classico è quando c'è la rotazione del display. In quel caso l'activity viene distrutta e ricreata quindi il sistema richiama automaticamente i due metodi. Un altro caso è quando c'è un'altra Activity attualmente visibile ed il sistema necessita di più risorse, in questo caso può decidere di killare l'altra.

    Dovresti provare a postare anche il resto dell'Activity perchè può essere che il problema stia da un'altra parte.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Allora l'app si apre con un dialog che richiede di inserire un nome, premendo "Continue" viene stampato un messaggio di benvenuto personalizzato, altrimenti premendo "Cancel" il messaggio non viene personalizzato. Ho fatto in modo che il dialog si apra solo la prima volta utilizzando una variabile statica, non so se è da cioccolataio ma al momento non mi veniva in mente altro

    codice:
    public class MainActivity extends AppCompatActivity
    {
        private static boolean firstTime = true;
        private TextView welcoming = null;
        private String welcomingString = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            if(firstTime)
                showDialogForm();
    
            welcoming = (TextView) findViewById(R.id.welcoming);
            welcomingString = (String) welcoming.getText();
    
        }
    
        private void showDialogForm()
        {
            final Dialog d=new Dialog(this);
            d.setCancelable(false);
            d.setContentView(R.layout.dialog_login);
            d.show();
    
            Button continueButton = (Button) d.findViewById(R.id.continueButton);
            Button cancelButton = (Button) d.findViewById(R.id.cancelButton);
    
            continueButton.setOnClickListener
                    (
                            new View.OnClickListener()
                            {
                                @Override
                                public void onClick(View view)
                                {
                                    EditText name = (EditText) d.findViewById(R.id.account_name);
    
                                    welcoming.setText("Welcome " +name.getText()+ ", this is my application!");
    
                                    welcoming.setTextSize(20);
    
                                    welcomingString = (String) welcoming.getText();
    
                                    d.cancel();
    
                                }
                            }
    
                    );
    
            cancelButton.setOnClickListener
                    (
                            new View.OnClickListener()
                            {
                                @Override
                                 public void onClick(View view)
                                {
                                    welcoming.setText("Welcome, this is my application!");
    
                                    welcoming.setTextSize(20);
    
                                    d.cancel();
    
                                }
                            }
    
                    );
    
            firstTime = false;
    
        }

    Dopodichè i due metodi:

    codice:
    @Override
    public void onSaveInstanceState (Bundle state)
    {
        super.onSaveInstanceState(state);
    
        state.putString("WelcomingText", welcomingString);
    
    }
    
    @Override
    public void onRestoreInstanceState (Bundle state)
    {
        super.onRestoreInstanceState(state);
    
        welcoming.setText(state.getString("WelcomingText"));
    
    }

    Ho pensato anche io che onRestore non venisse chiamato per quel motivo, ma ho anche letto sulla documentazione che il Bundle che riceve l'onCreate è lo stesso su cui salvo le cose nell'onSave, quindi ho provato a recuperare la stringa dall'onCreate ma il bundle risulta sempre null.
    Ultima modifica di Leonerd; 16-12-2016 a 14:51

  6. #6
    Aiuto

  7. #7
    scusa ma non ho ben capito.

    quando avvii l'activity, ti appare un dialog nel quale poter scrivere il nome.
    se lo scrivi, questo diventa il valore della textfield dell'activity, giusto?
    se è così che ci fai con due metodi?
    in teoria basta che valorizzi la textfield in chiusura di dialog.

  8. #8
    Quote Originariamente inviata da fermat Visualizza il messaggio
    scusa ma non ho ben capito.

    quando avvii l'activity, ti appare un dialog nel quale poter scrivere il nome.
    se lo scrivi, questo diventa il valore della textfield dell'activity, giusto?
    se è così che ci fai con due metodi?
    in teoria basta che valorizzi la textfield in chiusura di dialog.
    Sì, che è quello che ho fatto così nell'evendo di click (giusto?)

    codice:
    welcoming.setText("Welcome " +name.getText()+ ", this is my application!");
    
    welcomingString = (String) welcoming.getText();
    E fin qui tutto ok, sull'activity compare il messaggio. Il mio problema è che quando poi entro in una nuova activity e torno indietro, il saluto è scomparso, e io vorrei che rimanesse sempre visibile sulla prima activity

  9. #9
    non saprei.
    leggendo qui mi sembra che hai fatto tutto bene: https://developer.android.com/traini...ecreating.html

    però non ho mai provato.
    devi cercare di fare un pò di debug per capire se e quando si parde tale valore!

  10. #10
    Quello che mi manda in crisi è questo: cito la documentazione

    Both the onCreate() and onRestoreInstanceState() callback methods receive the same Bundle that contains the instance state information.
    Io quando salvo il bundle viene fatto correttamente, ma se poi nell'onCreate() vado a scrivere questo:

    codice:
    if (savedInstanceState != null)
        //recupera informazioni

    Non viene mai eseguito..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.