5

J'ai un TabActivity avec quatre onglets (chacun est sa propre activité). Chaque onglet définit son propre onCreateOptionsMenu (et dans certains cas, onPrepareOptionsMenu). Lorsque chaque onglet est chargé, un AsyncTask est lancé pour récupérer les données nécessaires pour remplir la liste de cet onglet. Si je passe très rapidement d'un onglet à l'autre (pendant le chargement) et que j'appuie sur le bouton de menu (alors que le AsyncApiTask de l'onglet actuel est toujours actif), le mauvais menu d'options s'affiche. Par exemple, FooActivity (onglet 1) a un menu d'options avec un élément «Actualiser» et BarActivity (onglet 2) a un menu d'options avec un élément «Afficher tout». Si je démarre l'application (avec l'onglet 1 actif), passez rapidement à l'onglet 2, puis cliquez sur le menu, l'élément "Actualiser" (plutôt que l'élément "Tout voir" attendu) sera parfois affiché. De plus, alors que ce comportement bizarre se produit parfois juste sur le premier menu, appuyez sur (et les pressions suivantes montrent les bons éléments), parfois il est "bloqué", et les mauvais éléments apparaissent sur chaque presse jusqu'à ce que je change d'onglet.Comportement de menu étrange options dans Android TabActivity

Toute idée de ce qui pourrait se passer? Je n'ai jamais entendu parler de cela avant, et je n'ai pas trouvé de bonnes suggestions.

+0

Ceci est l'une des liste apparemment infinie de raisons pour lesquelles je déteste utiliser des activités comme le contenu des onglets. Faites de vos onglets des vues simples, et ayez votre * single * 'onPrepareOptionsMenu()' délégué à une implémentation basée sur l'onglet actif. – CommonsWare

+0

Ah excellent, il est extrêmement réconfortant de savoir que je ne fais pas quelque chose d'horriblement mal à cause de ça. Je vais considérer cette solution. Merci! – jakeboxer

Répondre

0

Oui, la suggestion de CommonsWare est une meilleure solution! Vous pouvez même envisager d'utiliser FragmentTabHost et des fragments pour chaque onglet. De cette façon, l'activité de l'hôte peut mettre à jour le menu des options de onTabChanged(String tab).

Alors qu'un AsyncTask est engendré à partir d'un Activity, s'il n'a pas exécuté onPostExecute(...) il est toujours en cours. En outre, puisque le comportement par défaut de AsyncTask s est variable (différentes versions d'Android les exécutent séquentiellement/parallèlement), il est difficile de contrôler sans votre propre ThreadPoolExecutor. Votre Activity commutation rapide et répété AsyncTask s semblent bloquer.