Salvare la stringa sull'orientamento Modifica l'app di FC se modificato troppo rapidamente
-
28-10-2019 - |
Domanda
Ho problemi a salvare una stringa sull'orientamento cambiato. Ho provato a usare onSaveInstanceState()/onRestoreInstanceState()
e onRetainNonConfigurationInstance()/getLastNonConfigurationInstance()
senza fortuna.
Io ho:
@Override
public String onRetainNonConfigurationInstance(){
final String savedType = currentType;
return savedType;
}
e in onCreate()
Io ho:
currentType = (String) getLastNonConfigurationInstance();
Questo non ha ancora funzionato per me e currentType
è sempre null
Dopo un cambio di orientamento. Eventuali suggerimenti?
Revisione
Quindi questo è quello che ho attualmente e non funziona ancora:
@Override
protected void onSaveInstanceState(Bundle outState){
outState.putString("savedType", currentType);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
currentType = savedInstanceState.getString("savedType");
super.onRestoreInstanceState(savedInstanceState);
}
Ho provato a mettere il super
Metodo chiama all'inizio e alla fine di ogni metodo in ogni combinazione a cui potrei pensare ma sto ancora ottenendo un NullPointerException
per currentType
Quando la vista viene di nuovo creata.
Anche
Questo sta accadendo in una finestra di dialogo, non sono sicuro che ciò abbia a che fare con questo, ma ho pensato che potrebbe essere un po 'di informazione.
Soluzione parziale/nuova domanda parziale
Quindi ho funzionato un po 'come volevo. C'era una dichiarazione sepolta in un metodo che ha set currentType
a null
Verso la fine del ciclo di vita quando la variabile non sarebbe più necessaria. Ora è fuori mano. Lo schermo cambierà con successo gli orientamenti, ma se è cambiato tra i due successivamente troppo rapidamente, sarà FC. Questo è quello che ho usato per farlo funzionare in questo stato:
Campo di classe:
private String currentType;
Alla fine di onCreate
Io ho:
currentType = (String) getLastNonConfigurationInstance();
Poi:
@Override
public Object onRetainNonConfigurationInstance() {
final String s = currentType;
return s;
}
Funziona bene se l'orientamento non cambia e poi torna rapidamente. Vorrei risolvere questo problema perché i negozi di reparto e al dettaglio usano/lo useranno e posso vedere le persone che lo lasciano cadere, il che causerà un FC (l'ha lasciato cadere sul mio divano per testare). Sto solo memorizzando una stringa, quindi ciò che sto archiviando non occupa molta memoria. Qualche suggerimento per questa nuova situazione?
Soluzione 2
Quindi ho funzionato un po 'come volevo. C'era una dichiarazione sepolta in un metodo che ha impostato CurrentType su NULL verso la fine del ciclo di vita quando la variabile non sarebbe stata più necessaria. Ora è fuori mano. Lo schermo cambierà con successo gli orientamenti, ma se è cambiato tra i due successivamente troppo rapidamente, sarà FC. Questo è quello che ho usato per farlo funzionare in questo stato:
Campo di classe:
private String currentType;
Alla fine di Oncreate ho:
currentType = (String) getLastNonConfigurationInstance();
Poi:
@Override
public Object onRetainNonConfigurationInstance() {
final String s = currentType;
return s;
}
Funziona bene se l'orientamento non cambia e poi torna rapidamente. Fare nuove domande su questo nuovo bug,
Altri suggerimenti
Hai provato a metterlo in un fascio?
private static final String CURRENT_TYPE = "currentType";
private static final String DEFAULT_TYPE = "defaultType";
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putString(CURRENT_TYPE, currentType);
super.onSaveInstanceState(outState);
}
@Override
protected void onCreate (Bundle savedInstanceState) {
...
currentType = (savedInstanceState == null)? null :
savedInstanceState.getString(CURRENT_TYPE, DEFAULT_TYPE);
...
}