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?

È stato utile?

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);
  ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top