DialogFragment, das von onContextItemSelected angezeigt wird, überlebt onPause / onResume nicht

8

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

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

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

Doing # 1 funktioniert unter allen Lifecycle-Ereignissen einwandfrei, aber wenn ich es über # 2 aufrufe und ich die Aktivität pausiere (indem ich Home gehe) und es ü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 das Erscheinen des DialogFragments mit einer Verzögerung von mindestens 1/2 Sekunden in einen Handler gebe, funktioniert es.

Das folgende Snippet schlägt fehl - es zeigt das Dialogfeld an, aber dann pausiert es / unterbricht es:

%Vor%

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

%Vor%

Wenn Sie die 300 ms Verzögerung mit einer Verzögerung von 0 ms oder 250 ms ersetzen, wird sie erneut unterbrochen. Diese wiederholbare 100% der Zeit.

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

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

    
Tom anMoney 24.12.2012, 01:12
quelle

2 Antworten

4

Ich kann dies auf Android 4.2 (ARM-Emulator und Galaxy Nexus) reproduzieren. Ich kann Ihre Ergebnisse nicht auf einem x86 4.1-Emulator, einem Nexus S (4.1) und einem Motorola RAZR i (4.0) wiedergeben. Ich kann das Problem auch reproduzieren, indem ich eine meiner eigenen Buchproben modifiziere. Ich habe ein Problem mit Ihrem Beispiel eingereicht: Ссылка Fügen Sie bitte weitere Informationen hinzu denke, würde ihnen helfen, das Problem zu diagnostizieren.

In Bezug auf eine Workaround, wenn 300ms funktioniert, dann haben wir eine dieser schönen "Timing-Probleme", und ich habe nicht die foggiest Idee, wie Sie es umgehen würden, kurz ohne ein Menü zu verwenden, um es anzuzeigen . Wenn Sie beispielsweise Ihre Beispiel-App verwenden und einfach zu SHOW_AS_ACTION_ALWAYS wechseln (und daher ein Element in der Aktionsleiste anstatt in einem Überlaufmenü sein), reicht das DialogFragment aus, um sich ordnungsgemäß zu verhalten. Hoffentlich haben Sie eine Möglichkeit, Ihre Benutzeroberfläche anzupassen, um diesen Fehler zu beheben, oder vielleicht wird jemand eine andere Problemumgehung austüfteln und sie hier oder in dem Problem veröffentlichen.

    
CommonsWare 25.12.2012 19:39
quelle
2

Ich würde empfehlen, den Dialog in allen Pausen zu zerstören und in onResume abhängig vom Status neu zu erstellen, unabhängig davon, wie der Dialog aufgerufen wird. Andernfalls droht ein Speicherleck, wenn die App während der Pause vom Betriebssystem beendet wird.

Um Ihre Frage explizit zu beantworten, verlassen Sie sich nicht auf das Betriebssystem, um den App-Status beizubehalten.

    
Android Addict 24.12.2012 01:23
quelle