828 votes

Comment savoir quand un Fragment devient visible dans ViewPager

Problème: Fragment onResume() en ViewPager est tiré avant que le fragment devient réellement visible.

F. e. j'ai 2 fragment avec ViewPager et FragmentPagerAdapter. Le deuxième fragment peut être disponible pour les utilisateurs autorisés et je devrais demander à utiliser pour la connexion lorsque le fragment devient visible (boîte de dialogue d'alerte).

MAIS l' ViewPager crée le deuxième fragment lorsque le premier est visible pour le cache de la deuxième et de la rendre visible lorsque l'utilisateur démarre le mouvement du geste.

Donc, onResume() événement est déclenché dans le deuxième fragment de temps avant qu'il devient réellement visible et j'essaie de trouver l'événement lors de la deuxième fragment devient vraiment visible afin d'afficher la boîte de dialogue selon le moment.

Comment cela peut-il être fait?

610voto

gorn Points 1761

"Comment savoir quand un Fragment devient visible dans ViewPager. Personne?" – user1103561

Cela peut être un peu en retard à répondre, mais vous pouvez effectuer les opérations suivantes en remplaçant setUserVisibleHint:

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

532voto

Oasis Feng Points 1724

Mise à JOUR: Android Support Library (rev 11) enfin fixe l'utilisateur visible indicateur de problème, maintenant, si vous utilisez la bibliothèque de prise en charge pour des fragments, alors vous pouvez utiliser en toute sécurité getUserVisibleHint() ou remplacer setUserVisibleHint() pour capturer les changements décrits par gorn réponse.


La réponse dépassée:

Dans la plupart des cas d'utilisation, ViewPager seulement afficher une page à la fois, mais la pré-mise en cache des fragments, sont aussi "visible" de l'état (en fait invisible) si vous utilisez FragmentStatePagerAdapter dans Android Bibliothèque de prise en charge pré-r11.

Je remplace :

public class MyFragment s'étend Fragment
@Override
 public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
 si (visible) {
...
}
}

Pour capturer le focus de l'état de fragment, qui je pense est le plus approprié de l'état de la "visibilité" tu veux dire, car un seul fragment de ViewPager peut effectivement placer ses éléments de menu avec le parent de l'activité des éléments.

147voto

craigrs84 Points 397

Cela semble pour rétablir le onResume comportement que vous attendez. Il joue bien en appuyant sur la touche d'accueil pour quitter l'application, puis ré-entrer dans l'application. onResume n'est pas appelé deux fois dans une rangée.

@Override
public void setUserVisibleHint(boolean visible)
{
    super.setUserVisibleHint(visible);
    if (visible && isResumed())
    {
        //Only manually call onResume if fragment is already visible
        //Otherwise allow natural fragment lifecycle to call onResume
        onResume();
    }
}

@Override
public void onResume()
{
    super.onResume();
    if (!getUserVisibleHint())
    {
        return;
    }

    //INSERT CUSTOM CODE HERE
}

78voto

Konstantin Points 2070

Voici une autre manière à l'aide de onPageChangeListener:

  ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);
  FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);
  pager.setAdapter(adapter);
  pager.setOnPageChangeListener(new OnPageChangeListener() {

  public void onPageSelected(int pageNumber) {
    // Just define a callback method in your fragment and call it like this! 
    adapter.getItem(pageNumber).imVisible();

  }

  public void onPageScrolled(int arg0, float arg1, int arg2) {
    // TODO Auto-generated method stub

  }

  public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

  }
});

16voto

dan Points 41

Remplacer Le Fragment.onHiddenChanged() pour cela.

public void onHiddenChanged(boolean caché)

Appelée lorsque l'état caché (retourné par isHidden()) du fragment a changé. Des Fragments de commencer pas caché; ce sera appelée chaque fois que le fragment change d'état.

Paramètres:
caché - la valeur True si le fragment est maintenant caché, false si elle n'est pas visible.

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