Domanda

ho iniziato ad usare DialogFragment, perché stanno lavorando bene attraverso i cambiamenti di orientamento, e roba del genere. Ma c'è brutto problema che ho incontrato.

Ho AsyncTask che mostra l'avanzamento DialogFragment e lo liquida onPostExecute. Tutto funziona bene, tranne quando onPostExecute accade mentre applicazione è in background (dopo aver premuto il pulsante di casa, per esempio). Poi ho ottenuto questo errore su DialogFragment dismissing - "Can not perform this action after onSaveInstanceState". Doh. dialoghi regolari funziona bene. Ma non FragmentDialog.

Allora mi chiedo, qual è il modo corretto di licenziare DialogFragment mentre l'applicazione è in background? Non ho davvero lavorato con frammenti molto, quindi penso che sto solo perdendo qualcosa.

È stato utile?

Soluzione

DialogFragment ha un metodo chiamato dismissAllowingStateLoss()

Altri suggerimenti

Questo è quello che ho fatto (df == dialogFragment):

Assicurarsi che si chiama la finestra di dialogo in questo modo:

df.show(getFragmentManager(), "DialogFragment_FLAG");

Quando si desidera dismis finestra rendono questo controllo:

if (df.isResumed()){
  df.dismiss();
}
return;

Assicurarsi di avere quanto segue nel onResume () il metodo del frammento (non df)

@Override
public void onResume(){
  Fragment f = getFragmentManager().findFragmentByTag("DialogFragment_FLAG");
  if (f != null) {
    DialogFragment df = (DialogFragment) f;
    df.dismiss();
  }
  super.onResume();
}   

In questo modo, la finestra di dialogo sarà licenziato se è visibile .. se non è visibile la finestra sta per essere dismisded prossimo il frammento diventa visibile (onResume) ...

Questo è quello che ho dovuto fare per ottenere quello che vuoi: Ho un'attività Frammento su cui stavo mostrando una finestra frammento di nome fragment_RedemptionPayment che viene dichiarato a livello globale in alto. Il codice seguente chiude la DialogFragment se stava mostrando prima che l'attività va in background e torna in primo piano.

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}

Una soluzione che lavoro potrebbe tramonta Fragment.setRetainInstance(true) nel vostro dialogfragment, ma non è la più bella di correzioni.

A volte ho notato che devo fare la coda le mie azioni di dialogo per far ripristinare il quadro dello stato prima. Se è possibile entrare in possesso del (Activity.getMainLooper()) Looper attuale e avvolgente che in un Handler si potrebbe provare a passare il tuo licenziamento alla parte posteriore della coda pubblicando un eseguibile su quella coda.

Mi capita spesso di finire con un frammento separato che si retaininstance(true) che ha un ResultReceiver. Così passo su quella ricevente risultato ai miei lavori e callback maniglia nella sua OnReceive (spesso come un router per altri ricevitori). Ma che potrebbe essere un po 'più lavoro che vale la pena se si sta utilizzando le attività asincrone.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top