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

j'ai un ViewPager, chaque page est une vue de Fragment. Je veux tester si un fragment est dans une région visible. fragment.Essai seulement visible

  • le fragment est attaché à une activité
  • le fragment est réglé sur visible
  • le fragment a été ajouté à une vue

le ViewPager va créer 3 fragments (par défaut) et tous les trois répondent aux critères ci-dessus, mais seulement une est en fait visible à l'utilisateur (le yeux )

"
69
demandé sur davidshen84 2012-02-17 09:18:51

10 réponses

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

regardez le FragmentPagerAdapter javadoc en ligne et vous verrez qu'il y a une méthode setPrimaryItem(ViewGroup container, position int, Object object):void faire exactement ce dont vous avez besoin.

De la javadoc

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

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

paramètres conteneur la vue contenant à partir de laquelle la page sera retiré. positionnez la position de la page qui est maintenant la Primaire. objet le même objet qui a été retourné par instantiateItem(voir, int).

Note sur le parchemin

maintenant si vous implémentez ceci et commencez à déboguer pour avoir une idée de quand exactement ceci est appelé, vous remarquerez rapidement que ceci est déclenché plusieurs fois lors de la préparation du fragment et pendant que l'utilisateur est en train de glisser.

c'est pourquoi il serait peut-être bon de joindre également un ViewPager.OnPageChangeListener et ne faire ce qui doit être fait qu'une fois l'état scroll viewpagers devient SCOLL_STATE_IDLE à nouveau.

21
répondu hcpl 2013-05-14 19:30:44

C'est ce que j'utilise pour déterminer la visibilité d'un fragment.

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");
    }
}
66
répondu miroslavign 2015-10-14 10:13:47

pour mes besoins, il a fonctionné d'utiliser ViewPager.OnPageChangeListener.onPageSelected() en conjonction avec Fragment.onActivityCreated() pour effectuer une action lorsque le Fragment est visible. Fragment.getUserVisibleHint() aide aussi.

9
répondu Leo Landau 2013-07-07 22:51:01

j'utilise"setMenuVisibility" -méthode pour résoudre ce problème. Comme chaque Fragment peut avoir actionbar-éléments c'est la partie où vous pouvez déterminer le Fragment est actuellement visible à l'utilisateur.

@Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (!visible) {
        //not visible anymore
    }else{
        yay visible to the user
    }
}
3
répondu Frame91 2014-06-13 06:44:29

quel mal y a-t-il à utiliser getView().isShown() pour savoir si un Fragment est réellement visible?

3
répondu awy 2014-08-20 14:55:10
isVisible() 

peut toujours revenir vrai même si le fragment est derrière une activité.

j'utilise ce qui suit:

if (getView() != null && getView().isShown()) {
//your code here
}
3
répondu Peter File 2015-08-19 01:08:22

si vous savez à quelle" page " est attaché chaque fragment, vous pouvez utiliser ViewPager.getCurrentItem () pour déterminer quel fragment est "visible".

2
répondu roflharrison 2012-02-17 08:18:10

dans mon cas je dois faire un travail sur le premier fragment quand le fragment est visible à l'utilisateur

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);


    if(viewPager.getAdapter() instanceof YourPager)
    {
        Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method
        if( fragemnt instanceof YourFragment)
        {
            ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible();
        }
    }
}
0
répondu W00di 2016-07-26 06:42:30

setUserVisibleHint ne peut probablement pas être appelé, onHiddenChanged peut ne pas être appelé à chaque fois qu'un autre fragment est fermé. Ainsi, vous pouvez compter sur onResume (et onPause ), mais il est généralement appelé trop souvent (par exemple, lorsque vous activez un écran de périphérique). Aussi dans certaines situations il n'est pas appelé, vous devriez gérer le fragment courant dans l'activité de l'hôte et écrire:

if (currentFragment != null) {
    currentFragment.onResume();
}
0
répondu CoolMind 2017-04-05 15:00:36

Kotlin:

if (userVisibleHint) {
    // the fragment is visible
} else {
    // the fragment is not visible
}

Java

if (getUserVisibleHint()) {
    // the fragment is visible
} else {
    // the fragment is not visible
}

https://developer.android.com/reference/android/app/Fragment.html#getUserVisibleHint ()

https://stackoverflow.com/a/12523627/2069407

0
répondu s-hunter 2018-05-18 23:33:48