5 votes

onResume() ne se déclenche pas sur les éléments de l'hôte d'onglet qui changent de place.

J'ai un TabHost avec deux tabs en elle. La première fois que je passe à la seconde tab le site onResume() de la méthode de mon second tab's activity invoqué. Ensuite, j'ai un AlertDialog et après sa disparition, la méthode "onResume()" n'est pas appelée, mais je l'attends vraiment. Je suppose que l'invocation de 'AlertDialog' déclenche la méthode 'onPause()' et que 'onResume()' devrait être appelée avant que 'Activity' ne soit réellement affichée et prête à interagir avec l'utilisateur. Mais en réalité, la méthode "onPause()" n'est pas appelée lorsque je retourne à la première fenêtre de l'activité. tab qui est un autre activity .

Pouvez-vous m'expliquer pourquoi les méthodes "onPause()" et "onResume()" ne sont pas appelées et quelles méthodes sont appelées après l'affichage d'un "AlertDialog" ou le passage d'un mode à l'autre ? tabs ?

7voto

mthama Points 763

Lorsque vous créez un hôte d'onglet pour contenir des activités, les enfants à l'intérieur ne peuvent pas gérer leurs propres méthodes de cycle de vie (onResume, onPause, onCreated, etc), et le parent (le détenteur) doit faire toutes les gestions. J'ai implémenté ce comportement en écrasant onPause et onResume dans le titulaire (l'activité qui définit le tabhost), comme ceci :

_@Override public void onPause() { super.onPause(); try { mlam.dispatchPause(isFinishing()); } catch (Exception e) {} }

@Override
public void onResume() {
    super.onResume();
    try {
        mlam.dispatchResume();
    } catch (Exception e) {}
}_ 

Où " mlam "est l'instance de LocalActivityManager. Avec elle, je pense que vos méthodes onResume/onPause vont être déclenchées. J'espère que cela vous aidera d'une manière ou d'une autre.

2voto

HemanSuperman Points 31

La réponse de @mthama a parfaitement fonctionné et a déclaré LocalActivityManager comme une variable locale au niveau du Tabhost. Cependant, si je voulais qu'un seul des onResume() d'un onglet spécifique se déclenche, j'ai procédé comme suit.

protected void onResume() {
     super.onResume();       
     try {
         if(mLocalActivityManager != null){
             TabActivityOne tabActivity1 = (TabActivityOne) mLocalActivityManager.getActivity("tabId1");
             if(tabActivity1 != null){
                 tabActivity1.onResume();
             }  
         }           
    } catch (Exception e) {

    }               
}

1voto

66CLSjY Points 1291

Je suppose que l'invocation de l'"AlertDialog" déclenche la méthode "onPause()" et que la méthode "onResume()" doit être appelée avant que l'"Activité" ne soit réellement affichée et prête à interagir avec l'utilisateur.

AlertDialog n'affecte pas le cycle de vie de l'activité.

Consultez le diagramme du cycle de vie de l'activité ici.

Lorsque vous passez d'un onglet à l'autre, si vous voulez une méthode de rappel, pourquoi ne pas utiliser une fonction Écouteurs pour les changements d'onglet

1voto

jayzhou215 Points 71

J'ai le même problème, et j'ai essayé ceci, et ça marche~~.

private OnTabChangeListener TabChangeListener = new OnTabChangeListener() {

    @Override
    public void onTabChanged(String tabId) {
        if (tabId.equals("download")){
            mlocalActivityManager.dispatchPause(isFinishing());
            mlocalActivityManager.dispatchResume();
            tabs.setCurrentTab(1);
        }
    }
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X