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 )
"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.
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");
}
}
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.
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
}
}
quel mal y a-t-il à utiliser getView().isShown()
pour savoir si un Fragment est réellement visible?
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
}
si vous savez à quelle" page " est attaché chaque fragment, vous pouvez utiliser ViewPager.getCurrentItem () pour déterminer quel fragment est "visible".
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();
}
}
}
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();
}
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 ()