74 votes

Comment tester si une vue fragmentée est visible pour l'utilisateur?

J'ai un ViewPager, chaque page est une vue fragmentée. Je veux tester si un fragment est dans une région visible. le seul test Fragment.isVisible

  • le fragment est attaché à une activité
  • le fragment est mis à visible
  • le fragment a été ajouté à une vue

ViewPager crée 3 fragments (par défaut) et les trois répondent aux critères ci-dessus, mais un seul est réellement visible pour l'utilisateur (les yeux humains).

67voto

miroslavign Points 514

Voici comment je l'utilise pour déterminer la visibilité des fragments

 private static boolean m_iAmVisible;

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

    if (m_iAmVisible) { 
        Log.d(localTAG, "this fragment is now visible");
    } else {  
        Log.d(localTAG, "this fragment is now invisible");
    }
}
 

19voto

hcpl Points 5759

Vous avez raison, il y a une meilleure façon de le faire!

Jetez un oeil à la FragmentPagerAdapter javadoc en ligne et vous allez voir est une méthode setPrimaryItem(ViewGroup container, int, Object Object):void en train de faire exactement ce dont vous avez besoin.

À partir de la javadoc

public void setPrimaryItem (ViewGroup container, int, Object Object)

Appelé pour les informer de l'adaptateur de l'article qui est actuellement considérée comme être le "principal", qui est celui de montrer à l'utilisateur que l'actuel page.

Paramètres récipient contenant de Vue à partir de laquelle la page sera supprimé. la position la position de La page qui est maintenant le principal. l'objet même de l'objet renvoyé par instantiateItem(Vue, int).

Note sur l'état de défilement

Maintenant, si vous implémentez cette et démarrer le débogage pour avoir une idée de quand exactement ce qui est appelé, vous remarquerez rapidement c'est déclenché plusieurs fois sur la préparation du fragment et pendant que l'utilisateur est de glisser le long de.

Donc, il pourrait être une bonne idée également joindre un ViewPager.OnPageChangeListener et ne faire que ce qui doit être fait une fois que le viewpagers de défilement de l'état devient SCOLL_STATE_IDLE de nouveau.

9voto

Leo Landau Points 716

Pour mes besoins, cela fonctionnait d'utiliser ViewPager.OnPageChangeListener.onPageSelected() conjointement avec Fragment.onActivityCreated() pour effectuer une action lorsque le fragment est visible. Fragment.getUserVisibleHint() aide aussi.

3voto

awy Points 500

Qu'est-ce qui ne va pas avec getView().isShown() pour savoir si un fragment est réellement visible?

3voto

Frame91 Points 420

J'utilise la méthode "setMenuVisibility" pour résoudre ce problème. Comme chaque fragment peut avoir des éléments de barre d’action, c’est la partie dans laquelle vous pouvez déterminer quel fragment est actuellement visible pour l’utilisateur.

 @Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (!visible) {
        //not visible anymore
    }else{
        yay visible to the user
    }
}
 

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