5

Ich habe eine TabActivity mit vier Registerkarten (jedes ist eine eigene Aktivität). Jede Registerkarte definiert ihre eigenen onCreateOptionsMenu (und in einigen Fällen onPrepareOptionsMenu). Wenn jede Registerkarte geladen wird, wird eine AsyncTask gestartet, um die Daten abzurufen, die zum Auffüllen der Liste dieser Registerkarte erforderlich sind.Seltsame Optionen Menü Verhalten in Android TabActivity

Wenn ich sehr schnell zwischen Tabs wechseln (während sie noch geladen werden) und dann die Menü-Taste drücken (während der aktuelle Tab AsyncApiTask noch läuft), kann ich das falsche Optionsmenü erscheinen lassen.

Zum Beispiel, FooActivity (Registerkarte 1) hat ein Optionsmenü mit einem "Refresh" -Element, und BarActivity (Registerkarte 2) hat ein Optionsmenü mit einem "View All" -Element. Wenn ich die App starte (mit aktiver Registerkarte 1), schnell zu Registerkarte 2 wechseln und dann Menü drücken, wird manchmal der Eintrag "Aktualisieren" (statt der erwarteten "Alle anzeigen" -Objekt) angezeigt.

Während dieses seltsame Verhalten manchmal nur auf dem ersten Menü auftritt (und später drücken Sie die richtigen Elemente), manchmal wird es "stecken", und die falschen Elemente erscheinen auf jeder Presse, bis ich Tabs wechseln.

Irgendeine Idee, was könnte los sein? Ich habe davon vorher noch nichts gehört und konnte keine guten Vorschläge finden.

+0

Dies ist eine der scheinbar unendlichen Liste von Gründen, warum ich es verabscheue, Aktivitäten als Inhalt von Tabs zu verwenden. Machen Sie Ihre Tabs zu einfachen Views und lassen Sie Ihren * single * 'onPrepareOptionsMenu()' Delegaten in einer Implementierung basierend auf dem aktiven Tab erscheinen. – CommonsWare

+0

Ah ausgezeichnet, es ist extrem beruhigend zu wissen, dass ich nicht etwas Schreckliches falsch mache, um das zu verursachen. Ich werde diese Lösung in Betracht ziehen. Vielen Dank! – jakeboxer

Antwort

0

Ja, CommonsWare Vorschlag ist eine bessere Lösung! Sie könnten sogar in Betracht ziehen, FragmentTabHost und Fragmente für jede Registerkarte zu verwenden. Auf diese Weise kann die Host-Aktivität das Optionsmenü zentral von onTabChanged(String tab) aktualisieren.

Während ein AsyncTask von einem Activity hervorgebracht wird, wenn es onPostExecute(...) nicht ausgeführt hat, geht es noch. Auch, da das Standardverhalten von AsyncTask s ist variabel (verschiedene Versionen von Android führen sie sequentiell/parallel), ist es schwer zu steuern ohne eigene ThreadPoolExecutor. Ihr schneller Activity Switching und wiederholte AsyncTask s scheinen zu blockieren.