2011-08-23 17 views
5

Per quanto ho capito, l'attività Android verrà ricreata per il nuovo orientamento su eventuali cambi di orientamento.Salvataggio di alcuni dati sul cambio di orientamento in Android

C'è un modo per memorizzare/salvare alcuni dei dati dall'orientamento originale al cambio di orientamento?

Vorrei memorizzare alcuni bitmap, quindi non devo caricarlo di nuovo sul cambio di orientamento.

risposta

12

L'utilizzo di variabili/classi statiche rappresenta un approccio errato in termini di manutenibilità e debug.


Sono stato con Activity.onRetainNonConfigurationInstance ma ho scoperto solo ora che questo è deprecato (probabilmente dal nido d'ape o successiva). Activity.onRetainNonConfigurationInstance

Utilizzando questo metodo, basta chiamare Activity.getLastNonConfigurationInstance per recuperare lo stesso oggetto restituito nella onRetainNonConfigurationInstance. Assicurati di controllare null e cast nella classe giusta (puoi restituire/ottenere qualsiasi classe).Activity.getLastNonConfigurationInstance

Un esempio dell'uso in pseudo-codice sarebbe:

onRetainNonConfigurationInstance: 
    return "I need to remember this next time"; 

onCreate: 
    ... 
    String messageToShow = null; 
    Object data = getLastNonConfigurationInstance(); 
    if(data != null) 
     messageToShow = (String)data; 
    else 
     messageToShow = "Nothing to show"; 

Quindi, se ci si rivolge fino a 2.x.x è possibile utilizzare tale metodo. Altrimenti, Google consiglia di utilizzare Fragment.setRetainInstance. Questo è retrocompatibile tramite il pacchetto di compatibilità.

Fragment.setRetainInstance

+0

Giusto, il mio 1 punto a voi :) – darma

+0

@Pedro Loureiro Ma questo non funziona per un'attività, solo un Frutto, giusto? –

0

Il processo di esecuzione dell'attività non verrà riavviato. Il framework Android creerà solo una nuova istanza della tua attività. Quindi, come soluzione più semplice, puoi memorizzare i tuoi dati in variabili statiche.

+0

Così, ho potuto fondamentalmente creare le variabili come statico e li inizializza come null. Quindi, esegui un controllo nullo e, se non sono nulli, li riutilizzerò e, se sono nulli, li caricherò. Corretta? –

+1

Fare attenzione all'archiviazione delle variabili statiche; potresti leggere questo articolo molto interessante di Romain Guy: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ – darma

+0

Sì, hai ragione. –

5

Salvare gli elementi in un'attività principale o in una classe di utilità statica.

Altrimenti, è possibile utilizzare manifest per dire all'app di non distruggere l'attività sullo schermo ridimensionato. Date un'occhiata a questo articolo: http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

Grazie mille, questo mi ha aiutato molto e penso di poter risolvere il mio problema ora :-) Segnalo come risposta quando posso in pochi minuti. –

+0

bene grazie, lieto che abbia aiutato. – Noah

1

In realtà c'è un articolo molto carino sul sito degli sviluppatori Android che copre questo argomento.

Alcuni dispositivi, come il T-Mobile G1, possono modificare la configurazione dell'hardware in fase di esecuzione. Ad esempio, quando si apre la tastiera, , la schermata cambia dall'orientamento verticale all'orientamento orizzontale .

Per semplificare lo sviluppo di app Android, il sistema Android gestisce automaticamente gli eventi di modifica della configurazione e riavvia l'attività corrente con la nuova configurazione.

[...]

Anche se questo comportamento è davvero potente, dal momento che l'applicazione si adatta automaticamente alla configurazione del dispositivo in fase di esecuzione, è talvolta confusione per i nuovi sviluppatori di Android, che si chiedono perché la loro attività è distrutto e ricreato.

Di fronte a questo "problema" alcuni sviluppatori scelgono di gestire la configurazione stessi cambiamenti che è, in generale, una soluzione a breve termine che sarà solo complicare la loro vita in seguito.

[...]

The full article.

0

si può provare a utilizzare sharedpreferences:

editor edit = preferences.edit(); edit.putString("username", "new_value_for_user"); edit.commit();

Problemi correlati