Das von onContextItemSelected angezeigte DialogFragment überlebt onPause / onResume nicht

Ich habe ein DialogDragment, das ich auf zwei Arten anzeigen kann:

1) Durch Tippen auf ein ListView-Element in seinem OnItemClickListener

2) Durch Aktivieren eines ListView-Kontextmenüs und Auswählen eines Menüpunkts

Das Ausführen von Nummer 1 funktioniert unter allen Lebenszyklusereignissen, aber wenn ich es über Nummer 2 aufrufe und die Aktivität anhalte (indem ich nach Hause gehe) und sie über den Task-Switcher wieder aufnehme, wird das Dialogfeld nicht mehr angezeigt. Das Fragment ist da, und ich kann das Gerät drehen und den Dialog anzeigen.

Ich habe experimentiert und wenn ich die Darstellung des DialogFragments mit einer Verzögerung von mindestens 1/2 Sekunde in einen Handler stecke, funktioniert es.

Das folgende Snippet schlägt fehl - es zeigt das Dialogfeld an, wird dann aber durch Anhalten / Fortsetzen ausgeblendet:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        showMyDialogFragment();
        consumed = true;
        break;
    }

    return consumed;
}

Das folgende Snippet funktioniert also. Pause / Fortsetzen zeigt den Dialog wieder korrekt an:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        new Handler().postDelayed(new Runnable() {
            public void run() {
                showMyDialogFragment();
            }
        }, 300);

        consumed = true;
        break;
    }

    return consumed;
}

Wenn Sie die Verzögerung von 300 ms durch eine Verzögerung von 0 ms oder 250 ms ersetzen, wird sie erneut unterbrochen. Dies ist zu 100% wiederholbar.

Dies ist offensichtlich ein schrecklicher Hack, der durch die Konstante verschlimmert wird, die wahrscheinlich von der Geschwindigkeit des Geräts abhängt.

Weiß jemand, warum das so ist und / oder eine bessere Lösung anbietet? Ich habe Stunden mit diesem Thema verbracht und dies ist das Beste, was ich mir einfallen lassen konnte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage