web-dev-qa-db-fra.com

onTabSelected Sélectionné Non appelé

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);
42
Juliatzin del Toro

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();
    }
});
95
ianhanniballake

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é.
2
Suragch