2012-12-18 9 views
14

Ho una domanda riguardante DialogFragment. Sto cercando di creare una finestra di dialogo che mantenga lo stato dopo che il dispositivo è stato ruotato. Questa finestra di dialogo contiene una serie di riferimenti a cose come adattatori e altri oggetti più pesanti e ho bisogno che questa venga mantenuta a rotazione, se possibile senza dover rendere ogni riferimento Parcelable o Serializable per poter utilizzare onSaveInstanceState per salvarli e ripristinarli quando l'attività originale viene ricreata.DialogFragment con setRetainInstanceState (true) non viene visualizzato dopo che il dispositivo è stato ruotato

Ho notato che esiste un metodo chiamato setRetainInstance (booleano) nel DialogFragment che consente di mantenere l'istanza del frammento di finestra di dialogo quando l'attività viene ricreata. Tuttavia, quando ruoto il dispositivo ora, la finestra di dialogo non viene più visualizzata. So che posso ottenerlo dal FragmentManager dell'attività, ma non riesco a trovare un modo per renderlo nuovamente visibile. Qualche suggerimento su questo?

Grazie, Mihai

+1

Forse questo può aiutare: http://stackoverflow.com/questions/8235080/fragments-dialogfragment-and-screen-rotation –

+0

Vedo un problema concettuale molto più grande qui. Nei documenti di android per setFragmentInstance è scritto che "Controlla se un'istanza di frammento viene mantenuta attraverso la ricreazione di attività (ad esempio da una modifica di configurazione). Può essere utilizzata solo con ** frammenti non nello stack posteriore **. impostato, il ciclo di vita del frammento sarà leggermente diverso quando viene ricreata un'attività ". Questa cosa è dovuta al fatto che il frammento di dialogo è nel backstack? – Swapnil

risposta

21

Ci sono alcune cose che dovete fare: metodo di istanza factory

  1. uso di avviare un'istanza DialogFragment come questo:

    public static MyDialogFragment newInstance(MyModel model) { 
        MyDialogFragment myDialogFragment = new MyDialogFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("MODEL", model); 
        myDialogFragment .setArguments(bundle); 
        return myDialogFragment; 
    } 
    
  2. mettendo setRetainInstance (true) in onCreate, tutti i riferimenti dichiarati nel frammento verranno mantenuti dopo la creazione dell'attività originale

    @Override 
    public void onCreate(Bundle icicle) { 
        this.setCancelable(true); 
        setRetainInstance(true); 
        super.onCreate(icicle); 
    
    } 
    
  3. evitando scomparire a rotazione facendo questo

    @Override 
    public void onDestroyView() { 
        if (getDialog() != null && getRetainInstance()) 
         getDialog().setDismissMessage(null); 
        super.onDestroyView(); 
    

    }

  4. ottenere il vostro oggetto utilizzando

    (MyModel) getArguments().getSerializable("MODEL") 
    
+0

Grazie per la risposta @ ricky888, ma dal momento che sto creando un'istanza di frammenti di dialogo e passando cose nel costruttore del frammento della finestra di dialogo, come gli adattatori di lista e altri dati pesanti, ho voluto evitare la serializzazione e stavo pensando di usare set retain stato dell'istanza in modo tale che il frammento della finestra di dialogo non venga ricreato durante la rotazione. Quindi, ho pensato che usando lo stato di mantenimento dello stato di conservazione, avrò lo stesso frammento di dialogo di prima della rotazione, il che significa che il frammento della finestra di dialogo non è stato ricreato con l'attività e i suoi frammenti dopo la rotazione. È questo il caso? – r1k0

+0

setRetainInstance - Controlla se un'istanza di frammento viene mantenuta attraverso la ricreazione di attività (ad esempio da una modifica alla configurazione). Quindi la risposta è sì. Manterrai la stessa istanza di tutti i tuoi oggetti attraverso la rotazione semplicemente inserendoli nel pacchetto proprio come ho menzionato sopra. – ricky888

+0

In effetti la risposta corretta implicherebbe la serializzazione, quindi abbiamo ridisegnato il frammento con meno dati per poter mantenere il suo stato al momento delle modifiche alla configurazione, come suggerito da @ ricky888 – r1k0

0

la finestra frammento dovrebbe essere preservata automaticamente fino a quando si effettuano le seguenti operazioni:

  1. Se si chiama un onSaveInstanceState Activity(), assicurarsi che si chiama la funzione super !!!!. Nel mio caso, quella era la chiave. Assicurati anche di fare la stessa cosa nel frammento.
  2. Se si utilizza setRetainInstance, è necessario memorizzare manualmente i valori. Altrimenti, dovresti essere in grado di non preoccuparti, nella maggior parte dei casi. Se stai facendo qualcosa di un po 'più complicato, potresti aver bisogno di setRetainInstance(true), ma altrimenti ignorarlo.
  3. Alcune persone si sono lamentate di un bug nella libreria di supporto, dove viene inviato un messaggio di rimozione quando non dovrebbe essere. L'ultima libreria di supporto sembra averlo risolto, quindi non dovresti preoccuparti di questo.
+2

# 2, penso che tu intendessi " se non usi setRetainInstance ... "all'inizio della frase, altrimenti dovresti memorizzare e ripristinare i valori. –

Problemi correlati