web-dev-qa-db-fra.com

Détecter la modification de l'onglet ViewPager dans Fragment

J'ai un ViewPager avec plusieurs fragments. Dans un Fragment je joue de l'audio. Lorsque je glisse vers un autre fragment, je veux arrêter la lecture audio. Comment puis-je détecter que l'autre fragment est maintenant visible dans le ViewPager?

J'ai essayé de remplacer onStop et onHiddenChanged. Sans succès. Il doit y avoir une méthode "vous n'êtes plus actif" pour remplacer. Non?

65
l33t

J'ai fait quelques recherches et il s'avère que ViewPager appellera les deux: setUserVisibleHint et setMenuVisibility. Je remplacerais setUserVisibleHint puisque la documentation pour setUserVisibleHint indique:

Définissez une indication au système pour savoir si l'interface utilisateur de ce fragment est actuellement visible pour l'utilisateur. Cette indication par défaut est true et est persistante à travers l'enregistrement et la restauration de l'état d'instance de fragment. Une application peut définir ce paramètre sur false pour indiquer que l'interface utilisateur du fragment est déplacée hors de la visibilité ou n'est pas directement visible par l'utilisateur. Cela peut être utilisé par le système pour hiérarchiser les opérations telles que les mises à jour du cycle de vie des fragments ou le comportement de commande du chargeur.

Essayez de mettre ce code dans votre fragment:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    // Make sure that we are currently visible
    if (this.isVisible()) {
        // If we are becoming invisible, then...
        if (!isVisibleToUser) {
            Log.d("MyFragment", "Not visible anymore.  Stopping audio.");
            // TODO stop audio playback
        }
    }
}
137
louielouie