web-dev-qa-db-fra.com

Appel ViewPager setUserVisibleHint après le chargement du premier fragment

Dans mon application, j'ai un ViewPager qui contient de nombreux onglets glissables avec des fragments à l'intérieur. J'utilise la méthode setUserVisibleHint pour détecter le moment où une Fragment apparaît à l'écran. Cela fonctionne très bien lorsque l'utilisateur balaye entre les onglets mais ne fonctionne pas lors du premier chargement. Pour exécuter le code dans la méthode, je dois glisser à gauche, puis revenir à la première Fragment car la méthode setUserVisibleHint est appelée avant la méthode onCreateView

Avez-vous des idées sur la façon dont je peux exécuter ce code une fois que le premier fragment est visible? Existe-t-il une méthode dans la variable ViewPager ou autre chose?

39
Cilenco

Vous ne pouvez pas (et ne devriez pas) compter sur setUserVisibleHint pour cela. Au lieu de cela, vous devriez utiliser un ViewPager.OnPageChangeListener pour obtenir des rappels pour le moment où une page devient visible. Par exemple.

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});

Note: Vous pouvez utiliser ViewPager.SimpleOnPageChangeListener si vous n'avez pas besoin d'écouter tous les rappels.

Mettre à jour

La méthode setOnPageChangeListener est maintenant obsolète, utilisez plutôt addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});
58
Paul Burke

CI-DESSOUS TRAVAILLE POUR MOI

S'il vous plaît créer une vue globale comme celle-ci

View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        //inflate view layout
        view =inflater.inflate(R.layout.your_fragment, container, false);

        // return view
        return view;
    }

et utiliser cette

 @Override
        public void setUserVisibleHint(boolean isUserVisible)
        {
            super.setUserVisibleHint(isUserVisible);
           // when fragment visible to user and view is not null then enter here.
                if (isUserVisible && view != null)
                {
                   onResume();
                }

        }

et dans la méthode OnResume 

@Override
         public void onResume() { 
         super.onResume();   
            if (!getUserVisibleHint()) {
            return;
          }
      //do your stuff here
   }
4
Rahul

Vous devez appeler manuellement mViewPagerListener.onPageSelected(0); dans onCreateView dans votre activité/fragment racine.

3
Yuraj

Je ne comprends pas exactement ce dont vous avez besoin, mais vous pouvez détecter la page du fragment actuel en appelant ViewPager.getCurrentItem qui renvoie un entier.

J'espère que ça aide.

Bonne chance.

0
Emre Aktürk

Eh bien, sa solution de contournement plus, et peut-être que c'est mieux de configurer OnPageChangeListener, mais cela fonctionne pour moi. La tâche consiste à déterminer si le fragment actuel est visible à la création. Vous pouvez utiliser le menu pour faire cela. Dans votre fragment:

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true); // set current fragment has its own options menu
    } 

et ça

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     ...

            if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
                setUserVisibleHint(true); // manually set value to true
            }
     ...
    return view;

Peut-être que quelqu'un le trouvera utile. Cela fonctionne pour moi.

0
kara4k