FragmentPagerAdapter - comment détecter un clic ou un clic d'onglet lorsque l'utilisateur accède à un nouvel onglet?
J'ai un MainActivity
qui a trois fragments dans un FragmentPagerAdapter
comme ci-dessous. Comment puis-je savoir quand un utilisateur va du 1er fragment de seconde ou de la deuxième à la troisième, soit avec un balayage ou avec un clic sur l'onglet? J'ai vu que le getItem()
méthode n'est pas appelée toujours comme je l'ai déclaré mViewPager.setOffscreenPageLimit(2)
;
public class MainThreeTabAdapter extends FragmentPagerAdapter {
private final String[] CONTENT = new String[]{"News", "Rewards", "Me"};
public MainThreeTabAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return NewsFragment.newInstance();
} else if (position == 1) {
return RewardsFragment.newInstance();
} else if (position == 2) {
return MeFragment.newInstance(true, App.getAccountData().getId());
} else {
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position % CONTENT.length];
}
@Override
public int getCount() {
return CONTENT.length;
}
}
Dans le MainActivity de onCreate()
mainThreeTabAdapter = new MainThreeTabAdapter(getFragmentManager());
//Set up the ViewPager with the sections adapter.
//this ensures that 2 tabs on each side of current are kept in memory, which is all we need for our case. Default = 1
//this is all taken from the Quickreturn facebook sample app
mViewPager.setOffscreenPageLimit(2);
mViewPager.setAdapter(mainThreeTabAdapter);
source d'informationauteur dowjones123
Vous devez vous connecter pour publier un commentaire.
La
getItem()
méthode n'est appelée lors de la création d'une vue. Pour comprendre pourquoigetItem()
n'est pas appelé, elle aide à comprendre le comportement par défaut d'unViewPager
. Par défaut, lorsque vous êtes sur une page particulière d'unViewPager
il crée également les pages qui sont avant et après cette page en particulier. Si vous avez 3 fragments nommé et dans cet ordre [a,b,c], et que vous avez été sur la page b, en raison du comportement par défaut de la ViewPager fragments a et c, ce serait déjà créé par un appel àgetItem(int)
. Parce que les fragments sont déjà créés, vous ne serez pas obtenir un autre appel àgetItem()
De côté: ce comportement peut être modifié avec
ViewPager.setOffScreenLimit()
Ce que vous voulez vraiment faire afin d'être notifié lorsqu'un utilisateur change de pages est de définir un
OnPageChangeListener
à laViewPager
à l'aide deViewPager.addOnPageChangeListener()
pour être averti lorsqu'une page est sélectionnée.Tout d'abord, je suppose que vous avez déclarées ci-après les champs
Ensuite, vous devez créer votre instance de l'adaptateur et de le définir sur pager. Ici, vous pouvez ajouter un écouteur d'appel
addOnPageChangeListener
Toujours quand la page commute à nouveau en balayant ou en cliquant sur l'onglet de la méthode
onPageSelected(int position)
sera appelée.Si vous voulez obtenir de l'instance réelle de courant fragment d'interagir directement avec elle, vous pouvez créer votre propre
FragmentPagerAdapter
qui devrait cache créé fragments:De cette façon, vous avez à
MainThreeTabAdapter
deCachingFragmentPagerAdapter
addOnPageChangeListener
àViewPager
de trouver et d'interagir avec fragment de
onPageSelected
méthode comme suit:Si comme je suppose que vous êtes à l'aide d'un TabLayout avec votre ViewPager vous devez utiliser addOnTabSelectedListener(). Cela permettra de gérer à la fois explicite cliquez sur l'onglet ou un balayage.