Question

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

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

Le ViewPager va créer 3 (par défaut) fragment et trois d'entre eux répondent aux critères ci-dessus, mais une seule est réellement visible à l'utilisateur (l'être humain yeux )

Était-ce utile?

La solution

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

Jetez un oeil à la FragmentPagerAdapter javadoc en ligne et vous verrez qu'il existe une méthode setPrimaryItem (conteneur ViewGroup position int, objet Object):. vide faire exactement ce dont vous avez besoin

De la javadoc

setPrimaryItem public void (ViewGroup récipient, la position int, objet de l'objet)

Appelée pour informer l'adaptateur dont l'article est actuellement considéré être le « primaire », qui est l'un spectacle à l'utilisateur que le courant page.

Paramètres conteneur contenant View à partir de laquelle la page sera enlevé. La position de la position page qui est maintenant le primaire. objet Le même objet qui a été retourné par instantiateItem (Voir, int).

Note sur l'état de défilement

Maintenant, si vous implémentez cela et commencer le débogage pour avoir une idée de quand exactement ce qu'on appelle, vous remarquerez rapidement c'est déclenché à plusieurs reprises sur la préparation du fragment et pendant que l'utilisateur le long de glisser.

Il pourrait donc être une bonne idée de joindre une SCOLL_STATE_IDLE à nouveau.

Autres conseils

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");
    }
}

Pour mes fins, il a travaillé à utiliser ViewPager.OnPageChangeListener.onPageSelected() conjointement avec Fragment.onActivityCreated() pour effectuer une action lorsque le fragment est visible. Fragment.getUserVisibleHint() aide aussi.

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 quel 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
    }
}

Qu'est-ce qui ne va pas à l'utilisation getView().isShown() pour savoir si un fragment est en fait visible?

isVisible() 

ne 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
}

Si vous savez ce que « page » chaque fragment est attaché à vous pouvez utiliser ViewPager.getCurrentItem () pour déterminer quel fragment est « visible ».

Dans mon cas, je dois faire un peu de travail sur le premier fragment lorsque 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();
        }
    }
}

setUserVisibleHint peut probablement pas être appelé, onHiddenChanged peut être appelé pas à 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 mettez un écran de l'appareil). En outre, dans certaines situations, il est pas appelé, vous devez gérer un fragment actuel de l'activité d'accueil et d'écriture:

if (currentFragment != null) {
    currentFragment.onResume();
}

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top