Frage

Ich habe angefangen, Dialogfragment zu verwenden, weil sie durch Orientierungsänderungen und Sachen gut arbeiten. Aber es gibt ein böses Problem, das ich begegnet bin.

Ich habe AsyncTask Das zeigt die Dialogfragment des Fortschritts und lehnt es ab onPostExecute. Alles funktioniert gut, außer wenn onPostExecute passiert, während die Anwendung im Hintergrund ist (zum Beispiel nach dem Drücken der Home -Taste). Dann habe ich diesen Fehler bei der Entlassung des Dialogfragments erhalten - "Can not perform this action after onSaveInstanceState". Doh. Regelmäßige Dialoge funktionieren gut. Aber nicht fragmentdialog.

Ich frage mich also, was ist die richtige Art, Dialogfragment zu entlassen, während die Anwendung im Hintergrund ist? Ich habe nicht viel mit Fragmenten gearbeitet, also denke ich, dass mir nur etwas fehlt.

War es hilfreich?

Lösung

DialogFragment hat eine Methode genannt dismissAllowingStateLoss()

Andere Tipps

Das habe ich getan (df == dialogFragment):

Stellen Sie sicher, dass Sie den Dialog auf diese Weise anrufen:

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

Wenn Sie den Dialog entsetzen möchten, führen Sie diese Prüfung durch:

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

Stellen Sie sicher, dass Sie Folgendes in der OnResume () -Methode Ihres Fragments haben (nicht DF)

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

Auf diese Weise wird der Dialog entlassen, wenn er sichtbar ist. Wenn nicht sichtbar ist, wird der Dialog abgebrochen, als nächstes das Fragment sichtbar wird (OnResume) ...

Das musste ich tun, um das zu erreichen, was Sie wollen: Ich habe eine Fragmentaktivität, auf der ich ein Dialogfragment namens zeigte fragment_RedemptionPayment das wird weltweit oben erklärt. Der folgende Code lehnt die ab DialogFragment Wenn es gezeigt wurde, bevor die Aktivität im Hintergrund verläuft und wieder in den Vordergrund steht.

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

Eine Lösung, die funktionieren könnte, ist die Einstellung Fragment.setRetainInstance(true) In Ihrem Dialogfragment, aber das ist nicht die schönste Korrekturen.

Manchmal habe ich bemerkt, dass ich meine Dialogaktionen anstellen muss, um den Status zuerst wiederherzustellen. Wenn Sie den aktuellen Looper erhalten können (Activity.getMainLooper()) Und wickeln Sie das in einem Handler ein, dass Sie versuchen könnten, Ihre Entlassung an die Rückseite der Warteschlange zu geben, indem Sie einen Runnable in dieser Warteschlange veröffentlichen.

Am Ende verwende ich oft ein separates Fragment, dass es es retaininstance(true) das hat a ResultReceiver. Deshalb geben ich diesen Ergebnisempfänger an meine Jobs weiter und übernehme Rückrufe in seiner OnReceive (oft als Router für andere Empfänger). Aber das ist vielleicht etwas mehr Arbeit als es wert ist, wenn Sie asynchronen Aufgaben verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top