Je viens de migrer mon ancien ActionBar
vers le nouveau TabLayout
(Support Material Design).
Tout va bien mais je ne peux pas intercepter la sélection des onglets La méthode onTabSelected
n'est appelée que la première fois que TabLayout
est affiché, mais lorsque vous cliquez sur les onglets, rien ne se passe! Une idée de ce qui ne va pas avec ce code?
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
mViewPager = (ViewPager) findViewById(R.id.pager);
if (mViewPager != null) {
setupViewPager();
}
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
numTab = tab.getPosition();
prefs.edit().putInt("numTab", numTab).apply();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
tabLayout.setupWithViewPager(mViewPager);
Lorsque vous appelez setupWithViewPager
, cela appellera en interne setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
, remplaçant votre OnTabSelectedListener
.
Au lieu de cela, votre écouteur doit étendre TabLayout.ViewPagerOnTabSelectedListener , puis remplacer onTabSelected()
et appeler setOnTabSelectedListener()
après setupWithViewPager()
:
tabLayout.setupWithViewPager(mViewPager);
tabLayout.setOnTabSelectedListener(
new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
super.onTabSelected(tab);
numTab = tab.getPosition();
prefs.edit().putInt("numTab", numTab).apply();
}
});
Voici un exemple un peu plus complet avec trois onglets. Il utilise le plus récent addOnTabSelectedListener
plutôt que setOnTabSelectedListener
.
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
Log.i("TAG", "onTabSelected: " + tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
Log.i("TAG", "onTabUnselected: " + tab.getPosition());
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
Log.i("TAG", "onTabReselected: " + tab.getPosition());
}
});
Remarques:
onTabSelected
et onTabUnselected
sont appelés à chaque changement d'onglets.onTabReselected
est appelé chaque fois qu'un onglet est de nouveau cliqué alors qu'il est déjà affiché.