2011-11-10 15 views
5

Ho difficoltà a capire come creare un semplice DialogFragment per modificare un oggetto (complesso), ad esempio una persona, con nome e cognome e un elenco di indirizzi e-mail composti da un enum (lavoro, casa, ecc.) e l'indirizzo.Android DialogFragment e modifiche di configurazione

Prima di tutto, come faccio a passare correttamente l'oggetto Persona a un DialogFragment? La mia soluzione corrente ha un metodo setPerson (Person person), che viene chiamato dopo la creazione del mio DialogFragment, ma prima di dialog.show(). Funziona ok, fino a quando non avviene una modifica alla configurazione (l'utente ruota lo schermo). Il DialogFragment viene ricreato e il riferimento all'oggetto Person è nullo. So che posso salvare l'istanza utilizzando onSaveInstanceState, ma l'oggetto è complesso e costoso, e il persistere di un oggetto di grandi dimensioni in questo modo sembra uno spreco.

Ho anche provato a disattivare la modifica della configurazione nell'attività che utilizza la mia finestra di dialogo, e questo risolve il problema, ma voglio che la finestra di dialogo sia riutilizzabile e che tutte le attività che la utilizzano per disabilitare le modifiche alla configurazione sembra errata.

Terza opzione sarebbe quella di salvare il riferimento a Persona in una variabile statica, ma, ancora una volta, desidero che la finestra di dialogo sia riutilizzabile e in grado di supportare più istanze.

In che modo le altre persone gestiscono i loro oggetti costosi e complessi in finestre di dialogo riutilizzabili?

risposta

2

Bene, ci sono diverse soluzioni, nessuna delle quali è fantastica o sicura se non si è completamente in grado di serializzare l'oggetto che si sta modificando.

Non è consigliabile utilizzare mai android:configChanges="orientation" a meno che non sia assolutamente, 100% inevitabile. Ci sono altre modifiche alla configurazione e la tua app si interromperà ancora con le altre se utilizzi questa soluzione.

Ma una soluzione semplice che funzionerà nella maggior parte dei casi è chiamare setRetainInstance(true) sul DialogFragment. Questo eviterà che il tuo Frammento venga distrutto e ricreato in seguito a una modifica della configurazione. C'è un caso limite in cui questo potrebbe non funzionare, però. Ci sono altri motivi oltre alle modifiche alla configurazione in cui il sistema operativo tenterà di mettere un'attività "su ghiaccio", ad esempio per risparmiare memoria. In questo caso, il tuo oggetto andrà perso.

1

Il modo più pulito per passare un oggetto complicato da un frammento è di rendere l'oggetto attuare Parcelable, aggiungere l'oggetto ad un Bundle, e passare il fascio alla Fragment con fragment.setArguments(bundle). È possibile decomprimere l'oggetto in onActivityCreated() del frammento recuperando il pacchetto tramite una chiamata a .

a persistere l'argomento su modifiche di configurazione, semplicemente salvare il "working" Oggetto parcelable al fascio fornito da metodo del frammento, e decomprimere l'argomento più avanti in onActivityCreated() se savedInstanceState !=null.

Se si riscontra un notevole calo delle prestazioni dall'implementazione di Parcelable o se si dispone di un oggetto "live" di qualche tipo, un'opzione è creare un frammento non UI per contenere l'oggetto dati. Senza entrare nei dettagli, è possibile setRetainInstance(true) sul frammento non UI e coordinare la connessione con il frammento dell'interfaccia utente tramite le interfacce nello Activity.

Problemi correlati