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?
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.
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
}
});
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
}
Vous devez appeler manuellement mViewPagerListener.onPageSelected(0);
dans onCreateView
dans votre activité/fragment racine.
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.
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.